不积跬步之JavaScript new Class()的时候发生
2020-12-08 本文已影响0人
雨飞飞雨
一个问题:在JavaScript
中new Class()
一个对象的时候,具体会发生什么?
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const car1 = new Car('Eagle', 'Talon TSi', 1993);
new
操作符会进行如下的执行过程:
- 创建一个空的简单对象(即{})
- 链接该对象(设置该对象的
constructor
) - 将步骤1新创建的对象作为
this
的上下文 - 如果该函数没有返回对象,则返回
this
。
创建一个用户自定义的对象需要两步:
- 通过编写函数来定义对象类型。
- 通过
new
来创建对象实例。
创建一个对象类型,需要创建一个指定其名称和属性的函数;对象的属性可以指向其他对象,看下面的例子:、
当代码new Foo(...)
执行时,会发生以下事情:
-
一个继承自 Foo.prototype 的新对象被创建。
-
使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
-
由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)
你始终可以对已定义的对象添加新的属性。例如,car1.color = "black"
语句给 car1
添加了一个新的属性 color
,并给这个属性赋值 "black"
。但是,这不会影响任何其他对象。要将新属性添加到相同类型的所有对象,你必须将该属性添加到 Car 对象类型的定义中。
你可以使用Function.prototype
属性将共享属性添加到以前定义的对象类型。这定义了一个由该函数创建的所有对象共享的属性,而不仅仅是对象类型的其中一个实例。下面的代码将一个值为null
的color
属性添加到car
类型的所有对象,然后仅在实例对象car1
中用字符串"black"
覆盖该值.
参考自MDN