2016-09-20 47 views
1

https://danmartensen.svbtle.com/the-anatomy-of-a-javascript-function#creating-function-instances_3如何创建JavaScript函数对象,并得到他们的内部属性

我试图理解本文就如何创建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

+0

根据JavaScript函数是对象。即使Ecmascript调用相同http://www.ecma-international.org/ecma-262/5.1/#sec-13.2 –

+0

我想知道每个函数如何获得其内部属性和方法,如原型,调用,绑定等 –

回答

2

您正在经历prototype属性与对象原型之间的经典混淆。它们完全不同,尽管相关。

prototype属性函数是一个对象,它被设置为使用该函数作为构造函数创建的对象的原型。最初,它是一个空对象,除了指向构造函数的constructor属性外。

在创建对象时对象的原型(不是prototype属性)被设置时,从构造的prototype属性。它可能被称为__proto__属性,或通过Object.getPrototypeOf检索。

在你的情况,Personprototype财产这是最初除了constructor属性基本上是空的。它与Function对象的prototype属性无关。它成为通过new Person()创建的Person实例的原型。您可以添加自己的方法和属性,如Person.prototype.alert = function() { alert(this.name); };

完全分开其prototype属性Person具有来自Function对象的prototype的性质,因为Person使用Function构造隐式创建的原型。这就是Person得到bind等等(尽管如果你打算使用Person作为构造函数,我怀疑你是否会发现bind有很多用处)。

为了得到一个更好的主意,尝试在控制台以下:

function Person() { } 
Person.__proto__ === Function.prototype // true 
Function.prototype.isPrototypeOf(Person) // true 
Object.getPrototypeOf(Person) === Function.prototype // true 
+0

完美解释。感谢编辑,使其更容易理解 –

5

根据该声明,Function.prototype是(在这种情况下Person.prototype)分配到一个新创建的函数对象的原型

不可以。本文讲述了internal properties,如[[prototype]]。您无法将其作为普通资产进行访问,您可以使用Object.getPrototypeOf进行访问。确实,

Object.getPrototypeOf(Person) === Function.prototype // true 

.prototype属性是不同的东西。它也是在函数对象的实例化时创建的,但它确实被从([[prototype]])继承的对象填充)Object.prototype并包含指向该函数的.constructor属性。该对象将成为使用new Person创建的实例的[[原型]]。

+0

“您不能以普通财产的身份访问它“。但是我们添加属性到原型?使这些属性可用于该函数的所有实例 –

+0

是的,由[[prototype]]引用的对象的属性*可以正常访问,因为它们是继承的(这是整个事情的关键),但[[prototype]]链接本身不能使用属性访问。 – Bergi

相关问题