介紹原型 「論據」
大家都知道的JavaScript函數這些無聊的arguments
對象。
但爲什麼是對象?它不是一個數組?
不,這不是,這就是爲什麼很多人把它JavaScript中概念的失敗:
(function() {
return arguments.slice(); // TypeError: arguments.slice is not a function
}());
意向
好吧,這只是介紹了實際我想問的事情,但在問你需要一些更多的信息之前:
在最後幾天閱讀不同的代碼時,我在相當多的地方看到下面的代碼行時非常尷尬。
args = Array.prototype.slice(arguments);
那麼,這是什麼做的,僅僅是「轉化」的arguments
對象到一個數組與所有的原型和東西。
我的解決方案
我想起了什麼是以下幾點:雖然JavaScript是所有關於原型,我們爲什麼不延長arguments
對象的prototype
本身?我查了一些網站的現有腳本,但一無所獲,我打算找,終於把它寫自己:
(function() {
var i, methods;
arguments.constructor.prototype = Array.prototype;
methods = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 'slice', 'sort', 'splice', 'toString', 'unshift'];
for (i = 0; i < methods.length; i += 1) {
if (arguments.constructor.prototype.hasOwnProperty(methods[i]) === false) {
arguments.constructor.prototype[methods[i]] = Array.prototype[methods[i]];
}
}
}());
壓縮後只需要260字節,延長使用Array.prototype
的arguments
對象的prototype
。
因此,最後我可以處理arguments
對象,就像「真正」的數組一樣。
問題
檢查最著名的JavaScript框架我有以下完成後:沒有使用這樣的構建和擴展arguments
對象的prototype
。
但是爲什麼?有什麼不對嗎,我現在沒有想到?
其實你是對的,沒有注意到。這正是我一直在尋找的......呃,有時候這只是一些可以忘記考慮的事情... – 2012-08-07 17:46:00
這也是一個(除了表現之外)爲什麼迭代整數for循環優先於for-循環中。雖然可以在for-in中使用.hasOwnProperty()方法,但由於增強的本機對象(特別是Array對象)的潛力,通常不安全。 – 2012-08-08 02:25:15
@ say2joe for-in循環用於對象,for循環用於其他所有內容。 – jbabey 2012-08-08 12:29:48