一.实例对象之间的关联
通过一个构造函数(包括类)创建的实例,在构造函数内定义的属性和方法都会在每一个实例对象内访问到,但是每一个实例上的属性和方法都是独立不相等的。
二.原型上的属性变化
通过构造函数创建的所有实例的原型都为这个函数的prototype,同时这个构造函数的founction.prototype.constructor又指向founction, 关键:一旦修改founction.prototype内的属性,所有的实例上都会访问到
在这个例子中,
Person.prototype
被设置为等于一个通过对象字面量创建的新对象。最终结果
是一样的,只有一个问题:这样重写之后,
Person.prototype
的
constructor
属性就不指向
Person
了。在创建函数时,也会创建它的
prototype
对象,同时会自动给这个原型的
constructor
属性赋
值。而上面的写法完全重写了默认的
prototype
对象,因此其
constructor
属性也指向了完全不同
的新对象(
Object
构造函数),不再指向原来的构造函数。虽然
instanceof
操作符还能可靠地返回
值,但我们不能再依靠
constructor
属性来识别类型了


这里,
instanceof
仍然对
Object
和
Person
都返回
true
。但
constructor
属性现在等于
Object
而不是
Person
了。如果
constructor
的值很重要,则可以像下面这样在重写原型对象时专门设置一
下它的值:

三.类构造函数
使用 new
操作符实例化
Person
的操作等于使用
new
调用其构造函数。唯一可感知的不同之处就 是,JavaScript
解释器知道使用
new
和类意味着应该使用
constructor
函数进行实例化。
使用
new
调用类的构造函数会执行如下操作。
(1)
在内存中创建一个新对象。
(2)
这个新对象内部的
[[Prototype]]
指针被赋值为构造函数的
prototype
属性。
(3)
构造函数内部的
this
被赋值为这个新对象(即
this
指向新对象)。
(4)
执行构造函数内部的代码(给新对象添加属性)。
(5)
如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

默认情况下,类构造函数会在执行之后返回 this
对象。构造函数返回的对象会被用作实例化的对 象,如果没有什么引用新创建的 this
对象,那么这个对象会被销毁。不过,如果返回的不是
this
对 象,而是其他对象,那么这个对象不会通过 instanceof 操作符检测出跟类有关联,因为这个对象的原型指针并没有被修改。
四.原型方法与访问器
为了在实例间共享方法,类定义语法把在类块中定义的方法作为原型方法。


静态类成员在类定义中使用
static
关键字作为前缀。在静态成员中,
this
引用类自身。其他所
有约定跟原型成员一样:

五.类的继承
派生类的方法可以通过
super
关键字引用它们的原型。这个关键字只能在派生类中使用,而且仅
限于类构造函数、实例方法和静态方法内部。在类构造函数中使用
super
可以调用父类构造函数。

在静态方法中可以通过
super
调用继承的类上定义的静态方法:

在类构造函数中,不能在调用 super()之前引用 this。
