![](/img/trans.png)
[英]Javascript: How to run constructor logic of parent class after overriding inherited methods in child class?
[英]Javascript inherited class constructor issue
我想使用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;
从子类中删除“ a”属性
问题是,该行
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
创建的对象的原型。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.