。我平時看到的jQuery代碼或其他JavaScript框架源時,他們分配對象函數的原型,他們通常這樣做:爲什麼javascript函數原型需要修復構造函數?例如,
function A(){}
A.prototype = {
constructor: A,
// ....
}
,我真搞一下。我的意思是爲什麼它必須這樣做?
。我平時看到的jQuery代碼或其他JavaScript框架源時,他們分配對象函數的原型,他們通常這樣做:爲什麼javascript函數原型需要修復構造函數?例如,
function A(){}
A.prototype = {
constructor: A,
// ....
}
,我真搞一下。我的意思是爲什麼它必須這樣做?
在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
可能仍然是,以防萬一。
非常感謝... – 2015-02-24 11:04:30
這可能會回答你的問題:http://stackoverflow.com/questions/13140292/what-does-prototype-mean-here-the-the-jquery-source-code – 2015-02-24 10:11:41