多年来我一直在编写/扩展我的课程:
function Container(name, contents, logErrors){
this.name = name;
this.contents = contents;
this.logErrors = logErrors || false;
}
function Group(contents){
this.id = new Date().getTime();
Container.call(this, 'Group_'+ this.id, contents);
}
Group.prototype = Object.create(Container.prototype);
Group.constructor = Group;
然而,在某些地方,我看到构造函数属性是在子类的原型上分配的,而不是直接在子类上分配:
function Group(contents){
this.id = new Date().getTime();
Container.call(this, 'Group_'+ this.id, contents);
}
Group.prototype = Object.create(Container.prototype);
Group.prototype.constructor = Group; // <-----
a) Group.prototype.constructor = Group;
b) Group.constructor = Group;
c) both a AND b
d) neither a nor b
如果可能,请引用您的来源。
答案 0 :(得分:2)
你应该总是使用a) 这就是原因。
function Container(){
// code
}
function Group(){
// code
}
此时观察
console.log(Group.prototype.constructor === Group);
// true
console.log(Group.constructor === Function);
// true
现在,如果你这样做
Group.prototype = Object.create(Container.prototype);
你松开原来的Group.prototype
并替换了它的所有方法。这也意味着你也失去了原来的Group.prototype.constructor
。
因此,您可能会在此时观察到。
console.log(Group.prototype.constructor === Container);
// true
现在,如果你想要像复制方法那样的东西。
Group.prototype.copy = function() {
return new this.constructor(this.contents);
};
您最终可能会得到结果
var group1 = new Group();
console.log(group1.copy() instanceof Group);
// false
可能没有预料到。
但如果你愿意的话
Group.prototype.constructor = Group;
然后结果如预期
console.log(group1.copy() instanceof Group);
// true
另外,您可以在此处阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#Inheritance
希望有所帮助。
答案 1 :(得分:1)
只有 a)是正确的。 point of the .constructor
assignment是您的子类(即Group
)的实例继承了指向子类构造函数的.constructor
属性。它们确实从子类的原型对象(即Group.prototype
)继承它,而不是其他任何东西。
如果您的代码都没有使用.constructor
属性,也可以完全省略该语句。