我读过很多关于对象的原型属性的精彩文章和讨论(比如这篇),但是有一个重要问题。当我们观察"prototype"属性的行为时,我们会发现它实际上是另一个对象。我们可以看到它有自己的proto和构造函数属性,就像一个对象一样。
var myobj= function(){};
myobj.prototype.constructor== myobj --> true
以下是这些问题的答案:
- "prototype" 本身是一个对象吗?
- 原型和它所关联的对象(在这个例子中是 myobj)之间的关系是什么?
- 为什么 myobj.prototype.__proto__ 默认情况下是 "Object{ }",但它的构造函数是 myobj?
- 我们知道:"
__proto__
是用于解析方法等的查找链中实际使用的对象,prototype 是用于创建具有 new 关键字的对象时建立__proto__
的对象。" 但我们可以看到,这不仅是 prototype 的作用。我认为:原型就像一个包含对象的所有共享方法和属性的容器! 然后,当使用 new 创建对象的实例时,它的内部 [[Prototype]] 指向原型,从而暴露了类的共享行为和属性给实例!这是真的吗?
是的,"prototype" 本身是一个对象。
原型是一个对象,包含可共享的方法和属性。当你创建一个对象时,它的内部 [[Prototype]] 指向原型对象,从而暴露了类的共享行为和属性给实例。
myobj.prototype.__proto__ 是由默认的 "Object{ }" 构造的,因为 myobj 的原型对象是从 "Object{ }" 继承而来的。但是,myobj.prototype.constructor 指向的是 myobj 的构造函数。
是的,这是正确的。
最后: 似乎当我们实例化一个类时,该实例的构造函数被设置为该对象原型的构造函数。 这个结论是正确的。
var b= new myobj();
b.constructor== myobj.prototype.constructor --> true
b.constructor == myobj --> true
myobj.prototype={};
b.constructor == myobj --> false
b.constructor== Object --> true
myobj.prototype.constructor== Object --> true
prototype
属性,而不是所有对象。myobj
是一个函数。 - Felix Klingprototype
只是一个对象。这就是原型继承的工作方式:对象具有对另一个对象(它们的原型)的内部引用。有什么疑惑吗?我真的无法理解问题的核心。顺便说一下,b.constructor == myobj //--> false
是不正确的。即使在myobj.prototype = {};
之后,它仍然是true
。你是否对constructor
感到困惑?那只是每个prototype
对象都有的预定义属性。做console.dir(myobj.prototype)
,你会看到。 - Felix Kling