Javascript-调用父函数和扩展方法

Javascript-调用父函数和扩展方法,javascript,oop,Javascript,Oop,这可能是一个愚蠢的问题,但在Javascript(首选ES5)中是否有类似于如何在PHP中扩展父函数的方法来“扩展”类函数 基本上,我有来自System->武器->Dual的这个类层次结构,我想Dual使用来自System.setState()的代码,然后做更多的事情 注意:我的层次结构使用ES6之前的语法 function System(system){ this.setState = function(){ //do stuff } } function W

这可能是一个愚蠢的问题,但在Javascript(首选ES5)中是否有类似于如何在PHP中扩展父函数的方法来“扩展”类函数

基本上,我有来自
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%)。