你的問題在於this
不是你想象的那樣。如果您致電utils.slice(foo, 1, 2)
,this
將是utils
。
根據您要如何稱呼它,你可以傳遞你想作爲第一個參數來操作的對象,那麼你會怎麼做:
var utils = {
slice: function() {
// The object we're operating on
var self = arguments[0];
// The rest of the arguments
var args = Array.prototype.slice.call(arguments, 1);
return Array.prototype.slice.apply(self, args);
}
};
用法:
var someSlice = utils.slice(someArray, 2, 14);
另一個(也許更清楚)選項是隻使用命名參數:
var utils = {
slice: function(array, from, to) {
return Array.prototype.slice.call(array, from, to);
}
};
這將以同樣的方式工作。
更新:我好奇,爲什麼Uint8Array
沒有slice
,我發現了subarray
:
Int8Array subarray(
long begin,
optional long end
);
注意
注:請記住,這是創建對現有緩衝區的新看法;新對象內容的更改將影響原始對象,反之亦然。
可能是這種情況,這就是你想要的 - 我敢打賭它更有效率 - 如果你不需要複製數據,那就是!
'utils.slice.call(array,start,end)'。 – 2012-07-19 13:20:22
@Rocket我最近發表了我的最後一條評論,這實際上也是一個很好的解決方案,但我想保留它作爲方法集合,並用'.call'調用它會令人困惑。但是,謝謝,幫助我瞭解很多JavaScript! – 2012-07-19 13:29:50