2011-06-06 23 views
1

我瞭解JavaScript原型通過__proto__屬性繼承。但是我注意到,當我做var f = function() {} f現在除__proto__屬性之外還有prototype屬性。看起來prototype不參與財產鏈。 究竟是呢?JS函數的prototype屬性用於什麼?

+0

將函數作爲構造函數調用時,返回對象的'__proto__'屬性引用函數的'prototype'對象。 – 2011-06-06 18:26:21

回答

4

它被賦值爲使用該函數通過關鍵字new創建的對象的原型。

因此,例如:

function Foo() { 
} 
Foo.prototype.bar = 47; 

var obj = new Foo(); 
alert(obj.bar); // alerts 47, via `obj`'s prototype 

obj並分配給Foo.prototype對象之間的引用是一個人住一間,所以進一步增加了東西Foo.prototype會使他們出現在obj的原型:

Foo.prototype.charlie = 62; 
alert(obj.charlie); // alerts 62 

當然,如果你更換Foo.prototype(我勸阻),那麼你就指着Foo.prototype在不同的對象。 obj仍將參考老一:

Foo.prototype = {delta: 77}; // Not recommended 
alert(obj.delta); // alerts "undefined" 

Gratuitous live example

關於__proto____proto__是非標準。此前ECMAScript5(這是短短一年半了),有直接與對象的原型進行交互沒有標準的方法,你只能在創建對象的時候通過一個構造函數的prototype屬性分配他們的,只有間接的影響。 __proto__是一些JavaScript引擎的專有擴展(最着名的是Mozilla的SpiderMonkey,Firefox中的引擎)。它沒有任何標準,根據ECMAScript委員會,它不會。 (相反,ECMAScript5提供函數用於與對象的原型進行交互。)__proto__ is now deprecated由Mozilla提供。

3

_proto_屬性是對象的實例的屬性(該對象的存在,在這種情況下,一個功能),它是指該實例的原型。你應該注意到,這個屬性是非標準和折舊,使用Object.getPrototypeOf(ref)代替:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

prototype,相反,是一個函數的聲明(不是實例)的屬性,並且是原型函數的所有實例。退房的文檔:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/prototype

當你創建一個函數(使用new關鍵字)的新實例,函數對象被創建,由prototype定義。在實例化後(var myNewObject = new Foo()),對Object.getPrototypeOf(myNewObject)的調用將返回對實例所基於的原型的引用。

總結一下:__proto__是什麼東西,prototype是什麼東西可以(或可能已經是)。

+0

*「'_proto_'屬性是一個函數實例的屬性。* * *對象*的實例(可能已經或可能不是由函數創建的)。 – 2011-06-06 18:29:34

+0

夠公平的,它仍然是非標準的:) – 2011-06-06 18:35:46

+0

是的。不推薦使用,不要少於。 ;-) – 2011-06-06 21:23:41

相關問題