修复原型继承中的构造函数 属性
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);
本书 "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);