2017-04-24 145 views
2

所以,我有很多的代碼的地方,當我把一些元素數組:擴展現有的方法

arr.push(...) 

但問題是,我想每推後運行自定義代碼。基本上這個問題不僅僅是關於這個例子。我想要做的是這樣的:

func1.func2(...); 

在此之後我想運行其他功能,將得到所有的東西,這FUNC2沒有和例如記錄它。但是,在這些代碼的功能很多,這是不可取的每一次寫這樣的事:

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

相反,每func1.func2()我要自動運行另一個單獨的功能,這將得到的結果和記錄它。

+0

如果你有某種狀態管理,這將是比較容易有處理這個推你,可以做這些額外的管理/調試任務和方法。 –

回答

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);

3

真正做到這一點的唯一方法是將其包裝在一個可以完成額外工作的功能中。

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

您可以將另一個原型添加到使用內部推入然後執行任何其他操作的數組中。

let testArr = []; 
 

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

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

 
testArr.pushPlusStuff("test"); 
 

 
console.log(testArr);

這將使現有的.pushPlusStuff方法把所有Arrays

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'); 
};