我正在阅读一本JavaScript书籍,当我阅读有关继承的章节时,我想知道每次创建对象的实例是否真的是继承,特别是因为它们是相似的。
示例:原型链接 - someObject.prototype = new someOtherObject();
实例化对象var myArray = new Array()
相似吗?
此外,本书(针对Web开发人员的JavaScript,作者:Nicholas Zakas)表示,实例和构造函数的原型之间存在链接。(该链接通常称为__proto__
)
那么可以说实例化一个对象就像继承一样吗?
答案 0 :(得分:2)
没有。您感到困惑,因为完成继承的方法之一(即原型继承)作为原型采用给定的对象。一种获取对象的方法是通过构造函数。
换句话说,someObject.prototype = new SomeOtherObject()
没什么特别之处。你也可以这样做
someObject.prototype = { myObjectLiteral: "isJustAsGoodAsYourConstructoredInstance" };
甚至someObject.prototype = false
。从字面上看,这两个操作彼此无关。
编辑要解决他的书中的引用OP:
“回想一下之间的关系 构造函数,原型和 实例:每个构造函数都有一个 指向的原型对象 构造函数和实例有一个 指向原型的内部指针。“
不幸的是,这最多只会产生误导,而最坏的情况则是错误的。考虑一下“每个构造函数都有一个指向构造函数的原型对象”意味着什么。这意味着,例如,
Array.prototype === Array
Function.prototype === Function
function CustomConstructor() { }
CustomConstructor.prototype === CustomConstructor
但如果您在控制台中输入false
,则所有这些语句都会输出var myProto = {};
function CustomConstructor() { }
CustomConstructor.prototype = myProto; // inherit from the myProto object.
var x = new CustomConstructor(); // x is an "instance"
Object.getPrototypeOf(x) === myProto; // Object.getPrototypeOf fetches the "internal pointer"
。
现在考虑“实例有一个指向原型的内部指针”。这是事实,但不符合他使用的术语。这意味着:
prototype
但正如你所看到的,我没有使用构造函数继承,正如我试图在上面指出的那样。实例化对象不是以任何方式继承的。简单地说,构造函数的extends BaseClass
属性是如何完成原型继承的,就像通过在Java中的类定义之后放置{{1}}来实现经典继承一样。反过来,存在这种差异,因为原型继承允许您继承原型对象实例,而不是基础类 。
The JavaScript Garden有一些很好的部分可能会有所帮助。相关的是“原型”,“构造函数”和“运算符的实例”。
答案 1 :(得分:1)
如果我得到了你的继承概念,那么不使用objectType.inherits()就是你选择了正确的部分:
new someOtherObject()
这是someOtherObject的实例化。
这里发生的是你正在创建一个someOtherObject类型的对象,它从一个空对象继承结构(前提是你没有在这个上设置原型)。因为prototype的默认值是一个空对象{}
。
您将此对象作为someObject
的原型:
someObject.prototype = new someOtherObject();
现在,如果您创建someObject的实例,则会发生这种情况:
您创建someObject,在该时间点继承someOtherObject的结构,在实例化后继承(空)对象的结构。
也许更好的解释是说实例在那个时间点扩展了它的原型结构,并将所有继承的措辞放在一边,因为只是使用它可能会误导。由于经典继承使用基类(类型),因此proto使用这些实例。现在一切都取决于你如何看待继承,在javascript中对象的存在根本不存在(对象类型在运行时是可变的),因为卡尔·马克思认为真正的共产主义在概念中根本不可能。如果你同意这最后的陈述,那么比较和询问它并不重要,因为两者都不是。