使用返回数组的Object.defineProperty重新定义.push()

时间:2015-04-20 18:11:09

标签: javascript prototype defineproperty

如果我在通过在其构造函数原型上调用Object.defineProperty创建的对象上有一个属性,该对象返回一个数组,如:

function Foo() { 
    this._bar = []; 
}

Object.defineProperty(Foo.prototype, 'bar', { 
    get: function () { 
        return this._bar; 
    }
});

如何在派生的.push()属性上捕获和覆盖对bar的调用?

1 个答案:

答案 0 :(得分:4)

以下是有关如何覆盖您的财产push的完整实用示例。

function Foo() { 
    this._bar = []; 
    var oldPush = this._bar.push;
    this._bar.push = function(){

        for(var i = 0; i < arguments.length; i++){
            //do something with each element if needed
            $('body').append("<p>INSERTING VALUE: " + arguments[i] + "</p>");
        }

        oldPush.apply(this, arguments);
    };
}

Object.defineProperty(Foo.prototype, 'bar', { 
    get: function () { 
        return this._bar; 
    }
});

请查看此演示文稿:JSFiddle

更新:编辑代码,以便能够使用参数列表调用push,例如: foo.bar.push(1, 2, 3)