1

すべての変更メソッドのイベントを含む配列を作成しました。したがって、 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;

配列を console.log するか、たとえば should (a.should.eql(...)) を使用してテストで検証すると、すべてのプロキシ メソッドと on メソッドが考慮されます。

 [ 
    'one',
    'two',
    on: [Function],
    pop: [Function],
    push: [Function],
    reverse: [Function],
    shift: [Function],
    sort: [Function],
    splice: [Function],
    unshift: [Function] 
]

私が正しく理解していれば、代わりにプロトタイプをプロキシすることができますが、配列のすべてのインスタンスにはこれらの新しいメソッドがあります。

4

1 に答える 1

5

あなたが望むのは、これらのプロパティを を使用しObject.definePropertyて設定することです。これにより、デフォルトで列挙不可能に設定されます。

Object.defineProperty(arr, method, {value: proxy.bind(null, method)});
于 2013-06-02T18:52:37.170 に答える