4

我正在阅读一本 JavaScript 书籍,并且在阅读有关继承的一章时,我想知道是否每次创建对象的实例时都会发生继承,尤其是因为它们是相似的。

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

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

类似吧?

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

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

4

2 回答 2

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 中的类定义之后来完成的。反过来,这种差异是存在的,因为原型继承允许您继承原型对象实例,而不是基


如果您想了解更多信息,JavaScript Garden有一些不错的部分可能会有所帮助。相关的是“原型”、“构造函数”和“实例操作符”。

于 2011-06-18T04:22:26.853 回答
1

如果我了解了您的继承概念,则不使用 objectType.inherits() ,那么如果您选择了正确的部分:

new someOtherObject()

这是 someOtherObject 的实例化。

这里发生的是您正在创建一个类型为 someOtherObject 的对象,该对象从空对象继承结构(前提是您尚未在此设置原型)。因为原型的默认值是一个空对象{}

您将此对象作为原型someObject

someObject.prototype = new someOtherObject();

现在,如果您创建 someObject 的实例,这将发生:

你创建了 someObject ,它在那个时间点继承了 someOtherObject 的结构,当它被实例化时,它继承了(空)对象的结构。

也许更好的解释是,实例在那个时间点通过其原型的结构得到扩展,并将所有继承的措辞放在一边,因为仅仅使用它可能会产生误导。由于经典继承使用基类(类型),而 proto 使用这些的实例。现在这一切都取决于您如何看待继承,在 javascript 中根本不存在这种争论(对象类型在运行时是可变的),因为 Karl Marx 认为真正的共产主义在这个概念中根本不可能。如果你同意这最后一个陈述,那么比较和询问它并不重要,因为这两种情况都不是。

于 2011-06-18T04:23:38.360 回答