我想在javascript中使用原型从超类创建一个子类,所以我设置它们:
var SuperClass = function() {
this.a = 1;
this.get = function() {return this.a;}
this.init = function() {
CreateStrangeThings();
}
this.init();
}
var SubClass = function() {
this.b = 2;
this.get = function() {return this.b;}
}
SubClass.prototype = new SuperClass();
问题是,行SubClass.prototype = new SuperClass();
调用CreateStrangeThings();
函数。我希望只有在创建子类对象(var subOjbect = new SubClass();
)
如何克服这个问题?也许我应该使用SubClass.prototype = SuperClass;
?是明智的吗?
修改
SubClass.prototype = SuperClass;
从SubClass中删除“a”属性
答案 0 :(得分:2)
问题是,行
SubClass.prototype = new SuperClass();
调用CreateStrangeThings();
函数。
是。这就是为什么这种模式尽管经常被引用,但却是错误的。另一个原因是它忽略了超类构造函数可能需要参数的可能性。
相反,在不调用超级构造函数的情况下创建原型对象:
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;
...并且还调用SubClass
中的超级构造函数:
var SubClass = function() {
SuperClass.call(this);
this.b = 2;
this.get = function() {return this.b;}
};
所以我们一起得到:
var SuperClass = function() {
this.a = 1;
this.get = function() {return this.a;}
this.init = function() {
CreateStrangeThings();
}
this.init();
};
var SubClass = function() {
SuperClass.call(this);
this.b = 2;
this.get = function() {return this.b;}
};
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;
当然,使用ES2015和一个转发器。
class SuperClass {
constructor() {
this.a = 1;
this.get = function() {return this.a;};
this.init = function() {
CreateStrangeThings();
};
this.init();
}
}
class SubClass {
constructor() {
super();
this.b = 2;
this.get = function() {return this.b;};
}
}
如何克服这个问题?也许我应该使用
SubClass.prototype = SuperClass;
?是明智的吗?
没有。如果您希望通过new SubClass
创建的对象继承SuperClass.prototype
的属性,则需要SubClass.prototype
使用SuperClass.prototype
作为其原型。 SuperClass
没有; SuperClass
的原型是Function.prototype
,而不是SubClass.prototype
。 (忽略函数上prototype
属性的名称;它不是原型,原型new
分配给通过new TheFunction
创建的对象。)