gpt4 book ai didi

javascript - 原型(prototype)继承,无需创建父对象

转载 作者:行者123 更新时间:2023-11-28 00:31:53 25 4
gpt4 key购买 nike

所以,当我偶然发现多重继承这个主题时,我正在阅读《Head First Javascript Programming》这本书,顺便说一句,这是一本很棒的书,它让我学到了很多东西。

这本书告诉我,要实现多重继承,您应该将构造函数的原型(prototype)设置为父对象的新对象。

举个例子:

    //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;

现在我不同意这是最好的方法,你只为它的原型(prototype)属性调用 Dog 构造函数,但你也得到了它的 name 属性,你通常永远不会使用它,因此总是不明确的。

为什么不这样做:

 AwesomeDog.prototype = Dog.prototype;

无论如何,您只对原型(prototype)感兴趣,为什么不呢?

我认为这更好,因为有两个原因:

  1. 创建新对象的开销被忽略(微不足道,但很重要)
  2. 您 child 的原型(prototype)中不会出现无用的属性,这些属性可能始终保持未定义状态。

现在这本书在各个方面都很精彩,让我相信我可能错过了一些重要的东西,但我看不到是什么。我无法想象任何具有双重属性(子对象中的一个和原型(prototype)中未定义的版本)有用的用例。

我的思维方式正确吗?我可以坚持我的方法吗?

最佳答案

JavaScript中的对象继承也是构造函数继承的基础。每个函数都有一个可以修改或替换的原型(prototype)属性。该原型(prototype)属性会自动分配为一个新的通用对象,该对象继承自Object.prototype,并具有一个名为构造函数的自己的属性。实际上,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的对象的prototype属性,这意味着 YourConstructor 的任何实例也继承自 Object。原型(prototype)。 YourConstructor 是 Object 的子类型,而 Object 是父类(super class)型YourConstructor

关于javascript - 原型(prototype)继承,无需创建父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28904664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com