所以我正在阅读 Head First Javascript Programming 这本书,这是一本很棒的书,当我偶然发现多重继承的主题时,我学到了很多东西。
这本书告诉我,要实现多重继承,你应该将构造函数的原型设置为父对象的新对象。
举个例子:
//Parent
function Dog (name){
this.name = name;
};
//Child
function AwesomeDog(name){
Dog.call(this, name);
};
AwesomeDog.prototype = new Dog();
AwesomeDog.prototype.constructor = AwesomeDog;
AwesomeDog.prototype.isAwesome = true;
现在我不同意这是最好的方法,你只为它的原型属性调用Dog构造函数,但你也得到了它的name属性,你通常永远不会使用它,因此总是未定义。
为什么不这样做:
AwesomeDog.prototype = Dog.prototype;
你只对原型感兴趣,为什么不呢?
在我看来这更好,因为有两个原因:
现在这本书在各方面都很出色,这让我相信我可能错过了一些至关重要的东西,但我看不清楚是什么。我无法想象任何具有双重属性的用例(子对象中的一个和原型中的未定义版本)都是有用的。
我的思维方式是否正确,我可以坚持使用我的方法吗?
答案 0 :(得分:1)
JavaScript中的对象继承也是构造函数继承的基础。
每个函数都有一个可以修改或替换的prototype属性。该prototype属性被自动分配为一个新的通用对象,它继承自Object.prototype
并具有一个名为constructor的自有属性。实际上,JavaScript引擎会为您执行以下操作:
// you write this
function YourConstructor() {
// initialization
}
// JavaScript engine does this for you behind the scenes
YourConstructor.prototype = Object.create(Object.prototype, {
constructor: {
configurable: true,
enumerable: true,
value: YourConstructor
writable: true
}
});
所以没有做任何额外的事情,这段代码设置了构造函数
将属性设置为继承自Object.prototype
的对象,
这意味着YourConstructor
的任何实例也都从Object继承
。原型。 YourConstructor
是Object的子类型,Object是超类型
YourConstructor
。
答案 1 :(得分:0)
现在我不同意这是最好的方法,你叫狗 构造函数仅用于其prototype属性,但您也获得了名称 有它的财产,你通常永远不会使用,因此 总是未定义。
你完全正确。使用new
存在这些问题,因此不鼓励。
为什么不这样做:
AwesomeDog.prototype = Dog.prototype;
这有一个问题:AwesomeDog
和Dog
个实例共享相同的原型。因此,它们将继承相同的属性和方法,因此子类化没有意义。 constructor
应该是AwesomeDog
还是Dog
?
相反,正确的方法是将AwesomeDog.prototype
分配给继承自Dog.prototype
但未调用Dog
的对象。您可以使用Object.create
:
AwesomeDog.prototype = Object.create(Dog.prototype);
AwesomeDog.prototype.constructor = AwesomeDog;