Javascript子类。设置构造函数属性

时间:2016-07-05 22:53:48

标签: javascript oop prototype subclassing

多年来我一直在编写/扩展我的课程:

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  

如果可能,请引用您的来源

2 个答案:

答案 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属性,也可以完全省略该语句。