如何继承分配给变量的javascript匿名函数?

时间:2016-10-29 09:23:56

标签: javascript inheritance

试图理解javascript中的继承并完全混淆

我只需要DogCat拥有barkmeow函数,并且能够访问继承链中每个对象的this(不知何故):

    var cat = function() { this.name = "tom"; this.cat_instance = this; }
    var dog = function() { this.name = "bob"; this.dog_instance = this; console.log("cat is here!");} 

    cat.prototype.meow = function() { console.log("mhew");  }
    dog.prototype.bark = function() { console.log("whoof"); }

    var DogCat = function() {
        DogCat.prototype = dog.prototype;
        DogCat.constructor = cat;
        console.log("my name is " + this.dog_instance + " " + this.cat_instance);   
    }

所以DogCat.prototype现在(应该?)指向dog原型,在DogCat的情况下,我应该至少可以获得bark函数但实例没有这个功能。

好吧那是一团糟(在我看来),我现在尝试将两个继承的构造函数应用于一个孩子:

    var DogCat = function() {
        cat.apply(this);
        dog.apply(this);
        console.log("my name is " + this.dog_instance + " " + this.cat_instance);   
    }

然后,将原型指向一只狗:

    DogCat.prototype = dog.prototype;
    var d = new DogCat();
    > cat is here!
    >my name is [object Object] [object Object]

现在我可以访问bark但是如何处理meow功能?如何正确构建原型链?

UPD

抱歉DogCat应该有DogCat.prototype = dog.prototype,已修复

1 个答案:

答案 0 :(得分:2)

你大部分时间都在正确的轨道上,但也有一些错误。

您的第一个代码将无效,因为您在构造函数中分配原型,这意味着在创建对象后分配原型。第一个创建的对象不会有原型方法,但第二个会有。此外,您已经注意到指定constructor赢得了任何好处。您必须手动应用构造函数。

var DogCat = function() {
    cat.apply(this);
    dog.apply(this);
    console.log("my name is " + this.dog_instance + " " + this.cat_instance);
    }
DogCat.prototype = dog.prototype;

原型也只是普通物体。没有神奇的属性。你不能分配两个原型并期望它神奇地工作。如果要从两个基类继承,可以为方便起见编写inherit函数。

function copyPrototypeMethods(myClass,base){
    for(var prop in base.prototype){
        myClass.prototype[prop] = base.prototype[prop];
    }
}

// Use it like:
copyPrototypeMethods(DogCat, dog);
copyPrototypeMethods(DogCat, cat);

如果您知道要继承的内容,请手动分配基类所需的所有方法。

DogCat.prototype.bark = dog.prototype.bark;
DogCat.prototype.meow = cat.prototype.meow;