我试图用我自己的自定义 getter/方法来扩展内置,在Array我遇到数组文字之前一切都很好。
以下是我的代码:
/* ------------------ instance proxy ------------------ */
// extension of Array instances (proxy's handler)
const ArrayInstanceExtension = {
// "get" trap
get: (target, key) => {
switch(key){
/* -------- extensions -------- */
// arr.first
case "first": {
return target[0];
}
// arr.last
case "last": {
return target[target.length - 1];
}
/* -------- built-in -------- */
// original arr.prop/method
default: {
return (typeof target[key] === "function")
? target[key].bind(target) // method ⭐️
: target[key]; // property
}
}
}, // end: get
};
/* ------------------ class extension ------------------ */
// Array "class" extension (proxy's handler)
const ArrayClassExtension = {
// ⭐️ "construct" trap: intercepts `new Array(...args)`
construct: (target, args) => {
return new Proxy( new target(...args) , ArrayInstanceExtension )
// ╰ new Array(...) -╯ ╰- instance handler -╯
}
};
// ⭐️ Array extension (which will shadow the original Array)
// target ↴
// ╭- -╮ ╭--- extension ---╮
Array = new Proxy(Array, ArrayClassExtension);
/* ------------------ test run ------------------ */
// proxied array instance
let a = new Array(0,1,2,3,4);
// ⭐️ My problem is here:
// Array literals are not (automatically) proxied.❗️
let b = [1,2,3];
// unless we do it manually.
// b = new Proxy(b, ArrayInstanceExtension);
[
a.length, // 5
a.last, // 4
a.first, // 0
b.last, // ⭐️ proxied ? 3 : undefined
b.first, // ⭐️ proxied ? 1 : undefined
].forEach(x => console.log(x));
如上面的代码所示,我的问题是:当我使用new Array(...)语法时,一切都很好,但是如果我使用数组字面量语法,数组将不会被自动代理,这是我希望我能做到的不便使固定。
是否可以以任何方式“拦截”数组文字语法?谢谢。