如何解决在javascript中实例化对象真的只是继承吗?
| 我正在阅读一本JavaScript书,并且在阅读有关继承的章节时,我想知道是否每次创建对象实例时都会发生继承,特别是因为它们相似时。 示例:原型链-someObject.prototype = new someOtherObject();
实例化对象var myArray = new Array()
类似吧?
此外,该书(针对Web开发人员的JavaScript,作者:Nicholas Zakas)还指出,实例与构造函数的原型之间存在链接(该链接通常称为__proto__
)。
那么有人可以说实例化一个对象就像继承吗?
解决方法
不。您感到困惑,因为完成继承的一种方法(即原型继承)将给定的对象作为原型。获取对象的一种方法是通过构造函数。
换句话说,
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\"
但是正如您所看到的,正如我在上面指出的那样,我没有使用构造函数进行继承。实例化对象绝不是继承。构造函数的“ 9”属性就是完成原型继承的方式,就像经典继承是通过在Java中的类定义之后放置“ 10”来实现的。反过来,存在这种差异是因为原型继承可以让您继承原型对象实例,而不是基类。
JavaScript Garden中有一些不错的部分,如果您需要更多信息,可能会有所帮助。相关的是“原型”,“构造函数”和“运算符实例”。
, 如果我没有使用objectType.inherits(),就可以理解继承的概念:
new someOtherObject()
这是someOtherObject的实例。
这里发生的是您正在创建一个someOtherObject类型的对象,该对象继承了一个空对象的结构(前提是您尚未为此设置原型)。因为prototype的默认值是一个空对象{}
。
您将这个对象作为someObject
的原型:
someObject.prototype = new someOtherObject();
现在,如果您创建someObject的实例,则会发生这种情况:
您将创建一个在该时间点继承someOtherObject结构的someObject,该实例在实例化后将继承(空)对象的结构。
也许有一个更好的解释是,该实例在那时随其原型的结构得到扩展,并且将所有继承的措辞放在一边,因为仅使用该实例可能会引起误解。由于经典继承使用基类(类型),而proto使用基类的实例。现在,这一切都取决于您如何看待继承,而争论的焦点在javascript中根本不存在(对象类型在运行时是可变的),正如Karl Marx所说的那样,在这个概念上根本不可能实现真正的共产主义。如果您同意最后一条陈述,那么比较和询问它并不重要,因为两种情况都不是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。