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

如何继承分配给变量的javascript匿名函数?,javascript,inheritance,Javascript,Inheritance,试图理解javascript中的Inheritace,但完全弄糊涂了 我只需要那只狗有吠叫和喵喵功能,并且能够访问继承链中每个对象的这个(以某种方式): 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!")

试图理解javascript中的Inheritace,但完全弄糊涂了

我只需要那只狗有
吠叫
喵喵
功能,并且能够访问继承链中每个对象的
这个
(以某种方式):

    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
prototype,在
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
,修复了您大部分都在正确的轨道上,但有一些错误

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

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;

你基本上是在正确的轨道上,但也有一些错误

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

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;

原型的第一条规则是:。JS原型的第二条规则是:没有。对不起,谢谢你把这件事处理掉!但是如何构建复杂的应用程序并避免代码重复呢?只需重新分配原型属性,如
DogCat.prototype.meow=cat.prototype.meow?是的,除了继承之外,还有更多的模式可以避免代码重复。它们中哪一个最适合你的情况取决于你;如果你展示你的真实代码,我们可以提出一些建议。没有代码可以展示,因为我现在正在学习,也许你可以推荐一些书来阅读,(现在正在阅读'Stoyan Stefanov'javascript模式)或者一些中等规模的开源项目来深入研究和学习?不,没有什么特别的建议,每个人的风格都有点不同。然而,关于模式最重要的一课是——永远不要因为喜欢或一直使用某个模式而使用它,只在需要时使用它。从对象文字开始创建对象,然后根据需要添加:-)原型的第一条规则是:。JS原型的第二条规则是:没有。对不起,谢谢你把这件事处理掉!但是如何构建复杂的应用程序并避免代码重复呢?只需重新分配原型属性,如
DogCat.prototype.meow=cat.prototype.meow?是的,除了继承之外,还有更多的模式可以避免代码重复。它们中哪一个最适合你的情况取决于你;如果你展示你的真实代码,我们可以提出一些建议。没有代码可以展示,因为我现在正在学习,也许你可以推荐一些书来阅读,(现在正在阅读'Stoyan Stefanov'javascript模式)或者一些中等规模的开源项目来深入研究和学习?不,没有什么特别的建议,每个人的风格都有点不同。然而,关于模式最重要的一课是——永远不要因为喜欢或一直使用某个模式而使用它,只在需要时使用它。从对象文字开始创建对象,然后根据需要添加:-)您不应该命名该函数
inheritFrom
。相反,
copyPrototypeMethods
是合适的。术语“继承”意味着(使用
d=new DogCat
d instanceof Dog
d instanceof Cat
将起作用,但它们不起作用。您不应该将该函数命名为
inheritFrom
。相反,
copyPrototypeMethods
是合适的。术语“继承”意味着(使用
d=newdogcat
d狗的实例和
d猫的实例将起作用,但它们不起作用。