如何创建javascript函数对象并获取其内部属性

时间:2016-09-20 18:40:47

标签: javascript

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的规格,它有相同的陈述

enter image description here

2 个答案:

答案 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