JavaScript 中的“new”关键字

new 关键字是 JavaScript 的一个特定部分,会带来很多误解。

这段代码是对使用 new 关键字时发生的主要事情的快速概述。

如果 JavaScript 不是第一种编程语言,那么我们可能在每次启动类时都看到过这个关键字。

在探索 JavaScript 中的对象时,我们可能已经注意到对象是使用关键字 new 创建的。

让我们看一个例子:

function MyFunction() {
  this.val = 100;
}
let obj = new MyFunction();
console.log(obj.val);

一般来说,new 关键字执行以下任务:

  • 它生成一个空对象,例如对象 = { };
  • 它将新对象的不可见“原型”属性设置为构造函数可访问且可见的“原型”属性。
  • 它将使用 this 关键字声明的属性或者函数绑定到新对象。
  • 它返回新生成的对象,除非构造函数返回一个非空的对象引用。

在这种情况下,将返回该对象引用。

换句话说,JavaScript 执行一个函数并返回一个对象如下:

function Dog() {
  this.name = "Richi"
}
let myDog = new Dog("Retriever"); //{breed: "Retriever""}
console.log(myDog.name); //"Richi"

尽管为此添加了名称,但该函数返回一个对象。

请注意,构造函数指的是 new 关键字之后的函数,如下所示:

new ConstructorFunc(arg1, arg2)

完成后,如果请求新对象的未定义属性,脚本将检查对象的原型对象。
因此,通过这种方式,我们可以获得与 JavaScript 中的类继承等效的东西。

在 JavaScript 中,每个对象都有它的 prototype
我们只能在创建对象时使用 new、Object.create 或者基于文字来设置它。
你可以用 Object.getPrototypeOf(someObject)..

除了隐藏的 prototype属性外,还获得了一个称为原型的属性,我们可以访问和转换它,为我们创建的对象提供继承的方法和属性。

该示例将如下所示:

ObjectMaker = function () {
  this.a = 'first';
}; //ObjectMaker 只是一个函数,没有什么特别之处使它成为构造函数。
//ObjectMaker.prototype.b = 'second';
 //与所有函数一样,ObjectMaker有一个可访问的原型属性,我们可以对其进行更改。
//我刚加了一个叫做“b”的属性。与所有对象一样,ObjectMaker也有一个不可访问的[[prototype]]属性,
//我们对此无法执行任何操作
//
obj = new ObjectMaker(); //
//进行了3件事情
//创建了一个新的空对象,称为obj。起初obj与{}相同。
//然后将obj的[[prototype]]属性设置为ObjectMaker.prototype的当前对象值(如果后来为ObjectMaker.prototype分配了一个新的对象值,则obj的[[prototype]]不会更改,但您可以更改ObjectMaker.prototype的属性以添加到prototype和[[prototype]])。
//ObjectMaker函数被执行,obj1代替了这个。。。所以obj.a被设置为“first”。目标a;
//返回“first”obj.b;obj没有名为“b”的属性,因此JavaScript检查其[[prototype]]。
//它的[[prototype]]与ObjectMaker.prototype ObjectMaker.prototype具有名为“b”的属性,值为“second”,返回“second”

它看起来像类继承,因为我们应用 new ObjMaker() 生成的任何对象似乎都继承了“b”属性。

要获得子类,我们可以这样做:

function MyFunc() {
  this.name = "onitroad";
}
MyFunc.prototype.book = "Javascript";
let obj1 = new MyFunc();
console.log(obj1.name);
console.log(obj1.book);

尽管乍一看关键字 new 可能令人困惑,但我们可以通过探索其用例来掌握其基础知识。

为了有效地使用 JavaScript,我们需要了解 new 和 this 关键字的工作原理。

总而言之,让我们声明关键字 new 的目标是从构造函数创建一个对象。
它必须放在构造函数调用之前并执行以下任务:创建一个新对象,将此对象的原型设置为构造函数的原型属性,将使用 this 关键字声明的属性或者函数链接到新对象,以及,最后,返回一个新创建的对象。

日期:2020-06-02 22:16:29 来源:oir作者:oir