2015-02-24 83 views
2

。我平時看到的jQuery代碼或其他JavaScript框架源時,他們分配對象函數的原型,他們通常這樣做:爲什麼javascript函數原型需要修復構造函數?例如,

function A(){} 
A.prototype = { 
    constructor: A, 
    // .... 
} 

,我真搞一下。我的意思是爲什麼它必須這樣做?

+1

這可能會回答你的問題:http://stackoverflow.com/questions/13140292/what-does-prototype-mean-here-the-the-jquery-source-code – 2015-02-24 10:11:41

回答

2

在JavaScript中,所有通常創建的函數都具有prototype屬性,該屬性最初是JavaScript引擎創建的對象,其屬性爲constructor,該屬性引用該函數。因此,對於

function A() { 
} 

......我們知道,最初是A.prototype.constructor === A。這也意味着,通過new A創建的對象將繼承constructor等:

var o = new A(); 
console.log(o.constructor === A); // true 

但是,如果你更換對象上的prototype財產別的東西,因爲你的代碼片斷的話,那麼新事物的constructor財產(它繼承)指向錯誤的功能,除非您修復它:

function A() { 
} 
A.prototype = {}; // Replace the object 
var o = new A(); 
console.log(o.constructor === A);  // false 
console.log(o.constructor === Object); // true 

糟糕。這就是爲什麼你引用的代碼片段將它分配給A.prototype的對象設置爲constructor

但是constructor屬性有什麼意義?實際上,JavaScript規範中沒有任何東西使用那個屬性;只提及它與上述相關,確保prototype屬性上的初始對象具有constructor,並返回該函數。

但是,某些代碼(包括一些庫)可能會認爲constructor被設置爲「正確」(例如,JavaScript引擎默認設置的方式),並可能嘗試使用它來找出對象「 「(儘管這樣做通常很少,如果有任何理由的話;在極少數情況下,當你真的關心時,instanceof通常是更好的檢查方式,因爲它允許派生對象)。或者他們可能會嘗試在克隆操作中使用它,雖然從ES5開始有更好的方法。

在任何情況下,由於存在(罕見)代碼在那裏,其可以依賴於constructor屬性被設置爲它是由JavaScript引擎,表現良好的代碼替換prototype屬性完全設置constructor相同的方式JavaScript的以防萬一。

在實踐中,這是很常見供人更換時,在prototype屬性的對象,並在新的代碼,以便依靠constructor離開了那一步是不是最好的做法。但可以肯定你設置constructor可能仍然是,以防萬一。

+0

非常感謝... – 2015-02-24 11:04:30

相關問題