覆盖Javascript本机方法并调用super

时间:2015-11-05 14:14:50

标签: javascript

有人问我一个技巧问题,我不知道该怎么做。我会感激任何帮助。

问题:当您致电Array.push()时,它应该正常推送,并且还应该调用自定义功能。

这是我的尝试:

Array.prototype.push = function() {
  Array.prototype.push.call(this, arguments);
  if(typeof customMethod === 'function') {
    customMethod();
  }
} 

function customMethod() { 
  console.log('customMethod called');
}

但这不起作用。

3 个答案:

答案 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();
   }
}