从数组实例中隐藏额外的方法

Pic*_*els 1 javascript

我创建了一个包含所有变异方法事件的数组.因此,如果你做a.push a.on('push')被解雇了.我通过向数组实例添加新推送来实现此目的.现在的问题是,如果你在console.log中或在测试中比较数组,新方法也会显示出来.有没有办法隐藏这些新方法?

代码:

var oar = function (base) {

    var arr = base || [];
    var handlers = {};

    arr.on = function (event, callback) {
        if (typeof handlers[event] === 'undefined') {
            handlers[event] = [];
        }

        handlers[event].push(callback);
    };

    var proxy = function (method) {

        var args = Array.prototype.slice.call(arguments, 1);
        var result = Array.prototype[method].apply(arr, args);

        process.nextTick(function () {
            if (typeof handlers[method] !== 'undefined') {
                handlers[method].forEach(function (handler) {
                    handler(arr);
                });
            }
        });

        return result;

    };

    [ 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift' ].forEach(function (method) {
        arr[method] = proxy.bind(null, method);
    });

    return arr;

};

module.exports = oar;
Run Code Online (Sandbox Code Playgroud)

如果你在console.log中使用数组或者例如使用应该(a.should.eql(...))在测试中验证它,它会考虑所有代理方法和on方法.

 [ 
    'one',
    'two',
    on: [Function],
    pop: [Function],
    push: [Function],
    reverse: [Function],
    shift: [Function],
    sort: [Function],
    splice: [Function],
    unshift: [Function] 
]
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,我可以代理原型,但是然后所有数组实例都将拥有这些新方法.

Den*_*ret 5

你想要的是使用设置这些属性Object.defineProperty,默认情况下将它们设置为不可枚举:

Object.defineProperty(arr, method, {value: proxy.bind(null, method)});
Run Code Online (Sandbox Code Playgroud)

  • `enumerable`默认为`false`. (2认同)