我有以下要求:
我试过这样:
var Father = function() {
if(this.constructor === Father) {
// ...I throw an exception here to make it "abstract"...
}
alert('Father constructor');
};
Father.prototype.say = function() {
alert('Im your father');
};
var Son = function() {
Father.call(this);
alert('Son constructor');
};
Son.prototype = Object.create(Father.prototype);
var son = new Son();
son.say();
使用this.constructor === Father
我尝试将Father
实现为" abstract" "类" (如果它是真的,我在我的真实代码中抛出错误。)
Father.call(this);
确保调用我的超类的构造函数。但是this.constructor === Father
是真的。
有更好的方法吗?
答案 0 :(得分:2)
问题是您在进行派生时没有正确设置constructor
属性。在这一行之后:
Son.prototype = Object.create(Father.prototype);
你需要
Son.prototype.constructor = Son;
这只是使用构造函数执行此类继承的样板的一部分。没有它,Son.prototype
将继承JavaScript引擎在创建Father.prototype.constructor
函数时设置的Father
属性。您必须为Son
明确地执行此操作,因为您替换 Son.prototype
上的对象(这是正确的事情,您只需要执行此操作{{ 1}} fixup)。