2

我试图用我自己的自定义 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(...)语法时,一切都很好,但是如果我使用数组字面量语法,数组将不会被自动代理,这是我希望我能做到的不便使固定。

是否可以以任何方式“拦截”数组文字语法?谢谢。

4

0 回答 0