Javascript-调用父函数和扩展方法
这可能是一个愚蠢的问题,但在Javascript(首选ES5)中是否有类似于如何在PHP中扩展父函数的方法来“扩展”类函数 基本上,我有来自Javascript-调用父函数和扩展方法,javascript,oop,Javascript,Oop,这可能是一个愚蠢的问题,但在Javascript(首选ES5)中是否有类似于如何在PHP中扩展父函数的方法来“扩展”类函数 基本上,我有来自System->武器->Dual的这个类层次结构,我想Dual使用来自System.setState()的代码,然后做更多的事情 注意:我的层次结构使用ES6之前的语法 function System(system){ this.setState = function(){ //do stuff } } function W
System
->武器->Dual
的这个类层次结构,我想Dual
使用来自System.setState()
的代码,然后做更多的事情
注意:我的层次结构使用ES6之前的语法
function System(system){
this.setState = function(){
//do stuff
}
}
function Weapon(system){
System.call(this, system);
}
Weapon.prototype = Object.create(System.prototype);
function Dual(system){
Weapon.call(this, system);
this.setState = function(){ // this is the problem
System.prototype.setState(); // error - not defined
//Weapon.protoype.setState() doesnt work either
//do more stuff
}
}
Dual.prototype = Object.create(Weapon.prototype);
因为setState
是System
的一个实例属性,它不存在于System.proptotype
上,所以不能使用System.prototype.setState.call来调用它。如果您想在这种情况下调用它,只需从System
创建一个对象,如下所示
function Dual(system){
Weapon.call(this, system);
var parent = new System(system);
this.setState = function() {
parent.setState(); // done
}
}
实例属性在每个对象上都是重复的(它们不共享)。然而,原型属性将在子类之间共享(它们不会在子类上重复)。要使所有系统
的子类共享设置状态
功能,请将其添加到系统
的原型中
function System (arg) { ... }
System.prototype.setState = function () {...}
现在在你的孩子课堂上,你可以
function Dual(system){
Weapon.call(this, system);
this.setState = function() {
System.prototype.setState.call(this); // done
}
}
因为setState
是System
的一个实例属性,它不存在于System.proptotype
上,所以不能使用System.prototype.setState.call来调用它。如果您想在这种情况下调用它,只需从System
创建一个对象,如下所示
function Dual(system){
Weapon.call(this, system);
var parent = new System(system);
this.setState = function() {
parent.setState(); // done
}
}
实例属性在每个对象上都是重复的(它们不共享)。然而,原型属性将在子类之间共享(它们不会在子类上重复)。要使所有系统
的子类共享设置状态
功能,请将其添加到系统
的原型中
function System (arg) { ... }
System.prototype.setState = function () {...}
现在在你的孩子课堂上,你可以
function Dual(system){
Weapon.call(this, system);
this.setState = function() {
System.prototype.setState.call(this); // done
}
}
首先,您应该在原型上设置实例方法:
System.prototype.setState = function() {
// your stuff
}
这将提高性能,并允许您在不构建系统
实例的情况下继承该方法
然后,您只需要在正确的对象上调用System
版本的setState
(双实例),而不是在系统上调用它。prototype
:
Dual.prototype = Object.create(Weapon.prototype, {
'setState': { value: function(){
System.prototype.setState.call(this) // fixed
// other stuff
}}
})
首先,您应该在原型上设置实例方法:
System.prototype.setState = function() {
// your stuff
}
这将提高性能,并允许您在不构建系统
实例的情况下继承该方法
然后,您只需要在正确的对象上调用System
版本的setState
(双实例),而不是在系统上调用它。prototype
:
Dual.prototype = Object.create(Weapon.prototype, {
'setState': { value: function(){
System.prototype.setState.call(this) // fixed
// other stuff
}}
})
可能重复No,因为我没有使用ES6,正如我在post和code中所描述的。好吧,在您的情况下,您可以从您的Dual类中删除所有this.setState
声明,因为它应该已经从系统
类继承。我不确定我是否不擅长解释,但代码应该解释得很好。除了System.setState所做的之外,Dual.setState()还做了更多的工作。因此,我无法删除它。我希望它使用System.setState中的所有th代码,然后使用No的一些可能的副本,因为我没有使用ES6,正如我在post and code中所描述的。好吧,在您的情况下,您可以从双类中删除所有this.setState
声明,因为它应该已经从系统
类继承而来。我不确定我是否不擅长解释,但代码应该解释得很好。除了System.setState所做的之外,Dual.setState()还做了更多的工作。因此,我无法删除它。我希望它能使用System.setState中的所有th代码,然后是一些。它能带来多少性能?我实例化了几个douzen“系统”,每个系统有700行代码,其中670行是方法。将它们从类中“移出”重新排序到原型中会有多“有价值”呢?构造函数直接添加到实例中的每个方法都会为每个实例复制,因此您可以将内存占用乘以实例的数量,而实例化会稍微长一点(我想,对于670行函数来说,这是相当大的一部分,但如果没有你的代码,我无法测量)。相反,当添加到原型中时,每个方法都有一个副本,所有实例都使用它(查找原型链的成本很小,大约为1%),它会带来多少性能?我有几个douzen“系统”实例化后,它们每个都有700行代码,其中670行是方法。将它们重新排序“out”会有多“有价值”将类的类型添加到原型中?构造函数直接添加到实例中的每个方法都会针对每个实例进行复制,因此您可以将内存占用乘以实例的数量,而实例化会稍微长一点(我想,对于670行函数来说,这是相当长的一点,但如果没有您的代码,我无法测量)。相反,当添加到原型中时,每个方法都有一个副本,所有实例都使用它(查找原型链的成本很小,根据数据约为1%)。