2016-09-20 46 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

相關問題