在javascript中扩充继承的函数

时间:2013-12-13 17:48:05

标签: javascript oop inheritance

首先,我想说我真的试图寻找这个,因为我觉得好像以前曾经问过这个问题。也许我使用了错误的术语,但我还没有找到任何东西。无论如何,问题是:

假设我有一个父类:

function Parent(){
    this.say = function(words){
        console.log(words);
    };
}

继承自此的子类:

function Child(){
    Parent.call(this);
}

我希望子类具有say函数,除非我想预定义参数。例如,执行此操作的非理想方法是通过添加:

来重写函数
this.say = function(){
    console.log("hello")
}

但我宁愿以某种方式调用父的say函数并指定参数"hello"

你会怎么做?或者 - 这是考虑javascript继承的错误方法,如果是这样,你会推荐什么?

1 个答案:

答案 0 :(得分:2)

正确的做法是将所有实例共享的方法放在构造函数中的原型和特定于实例的代码上。

如果您愿意,可以覆盖子项原型上的任何方法:

function Parent(){ }

Parent.prototype.say = function(words) {
    console.log(words);
};


function Child() {
    Parent.call(this); // apply parent constructor to instance
}

Child.prototype = Object.create(Parent.prototype); // establish inheritance
Child.prototype.constructor = Child;

Child.prototype.say = function() { // override method
     // call parent method with specific argument
     Parent.prototype.say.call(this, 'hello');
};

.call(和.apply)允许您调用函数并显式设置函数内应引用的this。在这种情况下,我们调用父构造函数的.say方法,但由于我们也传递了this,所以就像在Child的实例上调用该方法一样。