试图理解javascript中的继承并完全混淆
我只需要DogCat拥有bark
和meow
函数,并且能够访问继承链中每个对象的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
,已修复
答案 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;