从其他类继承原型方法而不重写自己的原型方法

时间:2013-08-13 19:43:11

标签: javascript multiple-inheritance prototypal-inheritance

是否有更好的方法让类从另一个类继承原型方法,并且仍然能够在继承的类上定义新的原型方法:

var ParentConstructor = function(){
};

ParentConstructor.prototype = {
    test: function () {
        console.log("Child");
    }
};

var ChildConstructor = function(){
    ParentConstructor.call(this)
};

ChildConstructor.prototype = {

    test2: "child proto"
};

var TempConstructor = function(){};
TempConstructor.prototype = ParentConstructor.prototype;
ChildConstructor.prototype = new TempConstructor();
ChildConstructor.prototype.constructor = ChildConstructor;



var child = new ChildConstructor();

child.test();
console.log(child.test2)

console.log(child, new ParentConstructor());

哪个不起作用,因为当我从test2添加继承时,我丢失了ParentConstructor原型方法/属性。

我已经尝试过其他方法来扩展类的原型方法,其中一些原型道具形成其他类但我每次都失败了,因为我找不到每次都不覆盖以前方法的方法。

我也试过了var Child = Object.create(Parent.Prototype),但是当我定义新道具时,我失去了父道具。

2 个答案:

答案 0 :(得分:2)

ChildConstructor原型上定义新属性之前,应该先设置继承。当您定义新的原型属性时,您也不应该覆盖整个prototype属性。相反,您可以像添加constructor属性一样添加新属性:

ChildConstructor.prototype = new ParentConstructor();
ChildConstructor.prototype.constructor = ChildConstructor;

ChildConstructor.prototype.test2 = "child proto";

答案 1 :(得分:0)

我能想到的最好的例子来自:

http://robertnyman.com/2008/10/06/javascript-inheritance-how-and-why/

function Being() {
    this.living = true;
    this.breathes = function () {
       return true;
    };
}

function Robert() {
    // Robert.prototype = new Being(); /* edit */
    this.blogs = true;
    this.getsBored = function () {
        return "You betcha";
    };
}

Robert.prototype = new Being(); 

Robert.prototype.newMethod = function() {
    console.log('new method executed');
    return this;
}

注意这个例子,已经更新,下面的第一个注释是针对我的第一个代码,其中包含了Robert方法中的原型。