用 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)
.
如果我在一个对象上有一个 属性 通过在其构造函数的原型上调用 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)
.