扩展现有方法

时间:2017-04-24 14:51:39

标签: javascript oop

所以,当我将一些元素推送到数组时,我有很多代码的地方:

arr.push(...)

但问题是,我想在每次推送后运行自定义代码。基本上问题不仅仅是这个例子。我想做的是这样的事情:

func1.func2(...);

在此之后我想运行另一个函数来获取所有东西,func2做了,例如记录它。但是代码中的这些函数很多,每次写这样的东西都是不可取的:

if (func1.func2(...)) {
   log_results();
}

相反,对于每个func1.func2(),我想自动运行另一个单独的函数,它将获得结果并记录它。

4 个答案:

答案 0 :(得分:3)

真正实现这一目标的唯一方法是将它包装在一个能够完成你想要的额外工作的函数中。

function pushAndLog(item) {
  arr.push(item);
  // Additional Code here
  logResults();
}

答案 1 :(得分:1)

这是一个有趣的问题。有许多像Lodash这样的库,它们对函数做了类似的事情。类似于返回部分应用参数的函数副本的方法:_.curry。我测试了它,它适用于Array.prototype.push

做了一些研究我发现这篇文章有这个答案:JavaScript: clone a function并决定尝试做你想做的事情而不用clone方法。

这是我想出的。将console.log替换为您喜欢的任何功能或任何其他您想要的代码。



Array.prototype.push = (function() {
    var old = Array.prototype.push;
    var push = function () {
        console.log('my new push where I can do what I want, like log some stuff'); 
        return old.apply(this, arguments)
    };
    return push;
})();

var foo = [];
foo.push(1,2,3);
console.log(foo);




答案 2 :(得分:0)

您可以将另一个原型添加到使用push inside的Array,然后再使用其他任何您想要执行的内容。

let testArr = [];

Array.prototype.pushPlusStuff = function(val) {
   this.push(val);

   console.log("executing other stuff here");
};

testArr.pushPlusStuff("test");

console.log(testArr);

这会使.pushPlusStuff方法适用于所有Arrays

答案 3 :(得分:0)

实际上gforce301代码对我有帮助。我正在处理Google dataLayer,任务是记录所有推送数据(除了一些)。这段代码片段帮助了我:

var dataLayer_copy = dataLayer.push;
dataLayer.push = function() {
  dataLayer_copy.apply(this, arguments);
  console.log(JSON.stringify(arguments));
  $.post('/log', {data: arguments}, function() {

  }, 'json');
};