https://danmartensen.svbtle.com/the-anatomy-of-a-javascript-function#creating-function-instances_3
我试图理解这篇关于如何创建javascript函数对象的文章。 它说:
The new instance object is implicitly assigned many internal properties, one being the [[prototype]] property. The Function constructor’s prototype property referencing it’s prototype object is copied into this new object’s [[prototype]] property
基于上面的陈述,我写了这段代码:
function Person(){
}
console.dir(Function.prototype);
console.dir(Person.prototype);
根据语句将Function.prototype分配给新创建的函数对象的prototpe(本例中为Person.prototype)。我打印了他们两个。内容看起来不同。
有人可以解释我的理解错误的地方。顺便说一下,我也看过Ecmascript的规格,它有相同的陈述
答案 0 :(得分:5)
根据声明,
Function.prototype
被分配给新创建的函数对象的原型(在这种情况下为Person.prototype
)
没有。本文讨论internal properties,例如[[prototype]]。您无法将其作为普通属性访问,您可以使用Object.getPrototypeOf
访问它。事实上,
Object.getPrototypeOf(Person) === Function.prototype // true
.prototype
属性是另一回事。它确实是在函数对象的实例化时创建的,但它确实填充了一个继承自(has [[prototype]])Object.prototype
并且包含一个.constructor
属性的对象,该属性指向功能。该对象将成为使用new Person
创建的实例的[[prototype]]。
答案 1 :(得分:2)
您遇到了prototype
属性与对象原型之间的经典混淆。虽然相关,但它们完全不同。
函数的prototype
属性是一个对象,它被设置为使用该函数作为构造函数创建的对象的原型。最初,它是一个空对象,除了指向构造函数的constructor
属性。
在创建对象时,从构造函数的prototype
属性设置对象的原型(不是prototype
属性)。它可以被称为__proto__
属性,或通过Object.getPrototypeOf
检索。
在您的情况下,Person
有一个prototype
属性,除了constructor
属性外,它最初基本上是空的。它与prototype
对象的Function
属性无关。它成为Person
通过new Person()
创建的实例的原型。您可以添加自己的方法和属性,如Person.prototype.alert = function() { alert(this.name); };
。
完全独立于prototype
属性,Person
的原型来自prototype
对象的Function
属性,因为{使用Person
构造函数隐式创建{1}}。 Function
得到Person
等等(虽然如果您打算使用bind
作为构造函数,我怀疑您是否会对{{1}有很多用处}})。
要获得更好的想法,请在控制台中尝试以下操作:
Person