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