用 Object.defineProperty 重新定义 .push() 那个 returns 数组

Redefining .push() with Object.defineProperty that returns array

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

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

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

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

这是一个完整的工作示例,说明如何在 属性 上覆盖 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

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