2012-06-08 183 views
3

我想通過閱讀源學習MooTools的,我不明白爲什麼它使功能的本地副本:Mootools的代碼解釋

var Function = this.Function; 

但爲什麼它不會使陣列的本地副本,數字和字符串做同樣的事情,例如他們第一次出現被直接分配給,所以爲什麼對待功能不同?

Function.from = function(item){ 
    return (typeOf(item) == 'function') ? item : function(){ 
     return item; 
    }; 
}; 

Array.from = function(item){ 
    if (item == null) return []; 
    return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; 
}; 

Number.from = function(item){ 
    var number = parseFloat(item); 
    return isFinite(number) ? number : null; 
}; 

String.from = function(item){ 
    return item + ''; 
}; 

另外我不明白如何行149函數調用存儲在其本地原型屬性的實現函數?

Function.implement({ 

hide: function(){ 
    this.$hidden = true; 
    return this; 
}, 

protect: function(){ 
    this.$protected = true; 
    return this; 
} 

}); 

是因爲Function是一個函數,所以它的內部[[prototype]]是Function.prototype?

+1

關於第149行的更新,這是因爲'實現'位於'Function.prototype'上,它自動使其可用於其原型鏈中具有'Function.prototype'的所有函數。這包括構造函數,包括'Function'構造函數。 – 2012-06-08 21:38:03

+0

執行此操作...'Function.prototype === Object.getPrototypeOf(Function)',您會看到'Function'實例在其原型鏈中有其自己的'prototype'對象。你會得到相同的結果,你創建的函數...'Function.prototype === Object.getPrototypeOf(function(){})'http://es5.github.com/#x15.3.3 – 2012-06-08 21:39:52

+2

hide/protect是由Class使用的函數裝飾器 - 它們允許方法變成'private',因爲類構造器對象中的所有函數屬性都是'wrapped',並且如果保護標誌打開,它不會讓它在外部調用等等。除了Class本身,裝飾器沒有任何意義。查看MooTools的「類型」 - 例如。 https://github.com/mootools/mootools-core/blob/master/Source/Types/Function.js –

回答

2
  • 你會發現Function引用比其他構造比較多,所以它可能是他們增加了一個小小的性能提升本地參考,以及用於壓縮,因爲局部變量可以進行模糊處理。 ... (我們再看一下,我看到更多的參考其他構造比我原本。)

  • 你也注意到,鏈接到Function.prototype.extend功能.overloadSetter()包裝了功能與一堆額外的代碼,鴨子打字等。所以他們沒有使用它的原因可能是這些額外的代碼顯然不需要/不需要內部使用。

  • 因爲implement擴展了原型,所以並不總是可取的。有時你只是不想在所有實例上使用額外的方法,但是你確實想將它們存儲在邏輯名稱空間中,就像存儲在構造函數中的本地方法一樣。

+1

我想我的問題看起來相當糟糕,因爲只有開發人員能夠真正知道他們爲什麼要做這些事情,但您的答案是有道理的,滿足了我的好奇心,所以謝謝。 – 0xor1

+1

閉包內的局部'var'是有意義的,並且經常用作一個mootools模式。你可能會更好地優化這些,但請記住,'mootools-core'實際上由近30個不同的文件組成,並且可以通過僅包含你需要的部分來構建。大多數文件都帶有自己的關閉(範圍)。這使宏觀優化變量變得更加困難。它可以在較小的關閉中有意義,在性能至關重要的情況下 - 比如動畫,或者類構造函數/方法修飾符等等,其中可能會出現重複/循環引用,這些增益會加起來。 –

+1

http://jsperf.com/caching-into-local-scope - 檢查結果。特別是在Chrome中,對本地緩存有巨大的好處。 –