修复原型继承中的构造函数 属性

Fix for constructor property in protypical inheritence

本书 "JavaScript for Ninja" 建议在对象之间建立原型链时对构造函数 属性 进行以下修复:

如果我创建一个 Person 对象如下:

var person = new Person();
alert(person.constructor == Ninja); // Display true

尽管它解决了 ninja.constructor 将引用 Ninja 函数的问题,但它产生了另一个问题,现在 person.constructor 也将引用 Ninja 函数而不是 Person。

可重现的例子:

function Person() {

}
var person = new Person();
Person.prototype.dance = function() {};

function Ninja() {

}
Ninja.prototype = person;
Object.defineProperty(Ninja.prototype, "constructor", {
  enumerable: false,
  value: Ninja,
  writable: true
})
var ninja = new Ninja();

alert(person.constructor == Ninja); // Display true

我无法理解为什么作者建议进行此修复。

您只是在修改那个 person 实例的 constructor 属性,而不是整个 Person class。如果你这样做

person2 = new Person();
console.log(person2.constructor == Ninja);

它将打印 false.

请注意,在您引用的书中,它甚至没有将 new Person() 对象分配给变量,它只是创建了一个用于创建原型链的匿名对象。

一般来说,原型链中使用的对象通常不会在应用程序中用作实际对象,它只是用于链接相关的classes。

function Person() {
}
var person = new Person();
Person.prototype.dance = function() {};

function Ninja() {
}
Ninja.prototype = person;
Object.defineProperty(Ninja.prototype, "constructor", {
  enumerable: false,
  value: Ninja,
  writable: true
})
var ninja = new Ninja();

var person2 = new Person();
console.log(person.constructor == Ninja);
console.log(person2.constructor == Ninja);