有人问我一个技巧问题,我不知道该怎么做。我会感激任何帮助。
问题:当您致电Array.push()
时,它应该正常推送,并且还应该调用自定义功能。
这是我的尝试:
Array.prototype.push = function() {
Array.prototype.push.call(this, arguments);
if(typeof customMethod === 'function') {
customMethod();
}
}
function customMethod() {
console.log('customMethod called');
}
但这不起作用。
答案 0 :(得分:2)
您需要备份原始实现,然后调用它,否则您将进入无限递归。
Array.prototype._old_push = Array.prototype.push;
Array.prototype.push = function() {
Array.prototype._old_push.call(this, arguments);
if(typeof customMethod === 'function') {
customMethod();
}
}
答案 1 :(得分:2)
它不起作用,因为您引用了相同的方法,并导致递归。您必须存储原始"超级"方法,然后覆盖它以实现所需的效果。
以下是它的工作方式:
Array.prototype._push = Array.prototype.push;
Array.prototype.push = function() {
this._push.apply(this, arguments);
if(typeof customMethod === 'function') {
customMethod();
}
};
function customMethod() {
console.log('called custom method');
}
var a = [];
a.push(1);
a.push(2);
console.log(a);
答案 2 :(得分:0)
你不应该修改push的原型,因为你打算打破每个外部库。
但是如果你需要这样做,你可以保存旧的推送并重复使用它。
Array.prototype._oldPush = Array.prototype.push;
Array.prototype.push = function() {
Array.prototype._oldPush.call(this, arguments);
if(typeof customMethod === 'function') {
customMethod();
}
}
不要这样做,而是尝试使用外部方法来完成这些工作。
function CustomPush(array, datas) {
Array.prototype.push.call(array, datas);
if(typeof customMethod === 'function') {
customMethod();
}
}