Как изменить shadow Javascript Array? - PullRequest
       93

Как изменить shadow Javascript Array?

0 голосов
/ 02 августа 2020

Я запускаю самозаполняющуюся функцию, и я хотел бы изменить в ней объект Array и только в его области.

        var foo = "Foo Outer";
        (function(){
            var foo = 'Foo Inner !';
            console.log('INNER>',foo);
            // prints INNER> Foo Inner !
            var Array = {};
            var Array = Object.getPrototypeOf([]).constructor;
            Array.prototype.filter = ()=>{return "Array filter inner"}        
            console.log('INNER> array filter literal:', [1,2,3].filter(x=>x));
            // prints INNER> array filter literal:Array filter inner 
        })()
        console.log('OUTER> foo ', foo);
        // prints OUTER> foo Foo outer
        console.log('OUTER> Array filter', [1,2,3].filter(x=>x));
        // prints OUTER> Array filter Array filter inner
        // I want -> 
        // OUTER> Array Filter [1,2,3]

Как я могу изменять теневой массив и его методы только внутри область действия вызываемой самостоятельно функции, сохраняя при этом то же самое для остальной части скрипта?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

По-видимому, ответ (как было написано в комментарии @Bergi) заключается в том, что невозможно изменить теневой массив)

0 голосов
/ 02 августа 2020

Итак, в javascript массивы передаются по ссылке. Это означает, что вы всегда ссылаетесь на один и тот же «источник». Если вы измените массив в одном месте, эти изменения будут отражены во всех ссылках на этот массив.

Это означает, что если вы хотите, чтобы изменения одной версии теневого массива отличались от другой версии, вам необходимо чтобы сделать его копию и изменить эту копию.

Также похоже, что вы действительно пытаетесь выполнить sh вот локальный патч обезьяны метода фильтрации собственного массива. Я считаю, что метод, который вы здесь ищете, является прокси. Используя прокси, вы можете перехватить вызов собственного метода filter () и заменить его своим собственным. Прокси были представлены в ECMAScript2015. см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Этот предыдущий ответ может быть наиболее актуальным для вас Правильное расширение массива / прокси в ES6?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...