3 回答

TA貢獻1785條經(jīng)驗 獲得超8個贊
我不認為你可以像這樣“劫持”所有數(shù)組。即使您對本機Array
函數(shù)進行猴子修補,使用文字符號 ie 創(chuàng)建的數(shù)組也[]
不會受到影響:
console.log(new Array(1,2,3));
console.log([4,5,6]);
Array = function () {
throw new Error;
};
try {
console.log(new Array(1,2,3));
} catch (e) {
console.log('Cannot create array with new Array');
}
console.log([4,5,6]);
正如您可能認為的那樣,您需要將數(shù)組傳遞給其他東西。您只需選擇適合您的解決方案即可。就我個人而言,我會嘗試使用代理:
const spy =
(arr, fn) =>
new Proxy(arr, {
get(target, prop) {
if (prop === "max") {
return Math.max(...target);
}
if (prop === "min") {
return Math.min(...target);
}
if (typeof target[prop] === "function") {
fn();
}
return target[prop];
}
});
const arr = spy([1,2,3], () => console.log('spied'));
arr.push(500);
arr.push(-10);
console.log(arr.min, arr.max, JSON.stringify(arr), Array.isArray(arr));
我喜歡代理的一點是,它可以被設計成不會造成妨礙。上面的例子中arr
仍然是一個數(shù)組。您可以做您以前做過的所有正常事情。例如Array.isArray
仍然返回true
并JSON.stringify
仍然產(chǎn)生預期結(jié)果。
但是請注意,在上面的實現(xiàn)中,如果您從中生成另一個數(shù)組,arr
則不會自動代理:
const arr = spy([1,2,3], fn); arr.slice(1); // [2,3] (non-proxied array!)

TA貢獻1796條經(jīng)驗 獲得超10個贊
你在這里有正確的想法:
class MyCustomArray extends Array {
constructor(...args) {
super(...args);
console.log('custom array');
}
}
您只需要更改要Array擴展類的類,它應該是Array<T>這樣Array的:
class MyCustomArray extends Array<T> {
constructor(...items) {
super(...items);
console.log('custom array');
}
}
這里的<T>T 代表數(shù)組中包含的對象的類型,例如,如果它將是一個僅包含數(shù)字的數(shù)組,那么您可以將<number>.
現(xiàn)在您可以向該數(shù)組添加任何功能并使用以下語法創(chuàng)建該數(shù)組的實例:
const array = new MyCustomArray(item1, item2...)
希望這可以幫助

TA貢獻1942條經(jīng)驗 獲得超3個贊
嗯,它有點暴力,但是,Array 有點特殊,因為如果您為擴展類提供構(gòu)造函數(shù),則其創(chuàng)建新數(shù)組的方法將使用該構(gòu)造函數(shù),因此,例如,myCustomArray.filter
會生成myCustomArray
對象結(jié)果而不是一個Array
對象結(jié)果。(如果您不提供構(gòu)造函數(shù),則這不起作用)。
如果我想隨時訪問該自定義類型中數(shù)組的特定自定義功能,我可能會在創(chuàng)建時將值設置為 null,并擴展更改現(xiàn)有對象(如 )的方法以將其設置為 null,然后將其設置為 null?pop
。一種方法,該方法可以提供非空緩存值,或者計算、緩存并返回當前值。
我沒有仔細計算,但我認為只有少數(shù)數(shù)組方法可以更改現(xiàn)有數(shù)組(而不是創(chuàng)建新數(shù)組),因此應該不需要太多努力。
添加回答
舉報