不。你很困惑,因为完成继承的方法之一(即原型继承)将给定对象作为原型。获取对象的一种方法是通过构造函数。
换句话说,没有什么特别之处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有一些不错的部分可能会有所帮助。相关的是“原型”、“构造函数”和“实例操作符”。