在javascript中以某种方式实例化对象真的只是继承吗?

时间:2011-06-18 04:15:35

标签: javascript inheritance prototypal-inheritance

我正在阅读一本JavaScript书籍,当我阅读有关继承的章节时,我想知道每次创建对象的实例是否真的是继承,特别是因为它们是相似的。

示例:原型链接 - someObject.prototype = new someOtherObject();

实例化对象var myArray = new Array()

相似吗?

此外,本书(针对Web开发人员的JavaScript,作者:Nicholas Zakas)表示,实例和构造函数的原型之间存在链接。(该链接通常称为__proto__

那么可以说实例化一个对象就像继承一样吗?

2 个答案:

答案 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中对象的存在根本不存在(对象类型在运行时是可变的),因为卡尔·马克思认为真正的共产主义在概念中根本不可能。如果你同意这最后的陈述,那么比较和询问它并不重要,因为两者都不是。