2016-10-29 32 views
0

试图了解在JavaScript inheritnace和完全糊涂如何继承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

原型的第一条规则是:[永不分配给它们在构造函数中](http://stackoverflow.com/q/21296559/1048572)。 JS原型的第二条规则是:没有[多重继承](https://en.wikipedia.org/wiki/Multiple_inheritance)。抱歉。 – Bergi

+0

感谢您解决这个问题!但如何构建复杂的应用程序并避免如何避免代码重复?只是重新分配原型属性,如“DogCat.prototype.meow = cat.prototype.meow;'? –

+0

是的,除了继承之外,还有更多的模式可以避免代码重复。哪一个最适合你的情况呢?如果你显示你的真实代码,我们可以提出一些建议 – Bergi

回答

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; 
+2

您不应将该函数命名为“inheritFrom”。相反,'copyPrototypeMethods'将是合适的。术语“继承”意味着(用'd = new DogCat'''''''''''''''''''''''''''''''''''''''),它们不会。 – Bergi