2013-02-25 92 views
0

在學習Javascript的時候,我試着重新聲明函數的apply屬性。至今沒有問題。現在Invoke Function.prototype.apply裏面重新聲明apply(Javascript)

function foo() { return 1; } 
alert(foo()); // 1 
alert(foo.apply(null)); // 1 
foo.apply = function() { return 2; } 
alert(foo()); // 1 
alert(foo.apply(null)); // 2 

,我試圖讓應用做更多的事情,並稱之爲「老」應用(如日誌)。

var old = foo.apply; 
foo.apply = function() { 
    alert("A"); 
    return old(null); 
} 
alert(foo.apply(null)); 

我得到

TypeError: Function.prototype.apply was called on [object Window], which is a object and not a function


我試圖

foo.apply = function() { 
    alert("A"); 
    return arguments.callee[Function.prototype.apply](null); 
} 
alert(foo.apply(null)); 

我得到

TypeError: Property 'function apply() { [native code] }' of object function() { alert("A"); return arguments.calleeFunction.prototype.apply; } is not a function


有沒有什麼真正的方法來幫助我嘗試?還是由於Function.prototype.apply是本機代碼而受到一些限制?

+0

它適用於我在鉻... – loxxy 2013-02-25 15:15:37

+0

@Ioxxy哪個版本?我粘貼的輸出來自Chrome的控制檯:/ – 2013-02-25 15:16:49

+0

您的第一個解決方案適用於Chrome(v25)。你使用的是什麼瀏覽器? – 2013-02-25 15:17:25

回答

3

是的。 apply預計適用於某個功能(是,完全由它自己),而您使用它的方式(由old())將其全球對象(window)設置爲this value。所以,你可以這樣做:

var old = foo.apply; // === Function.prototype.apply 
foo.apply = function() { 
    // "this" is the function foo 
    alert("A"); 
    return old.apply(this, arguments); // applying the (old) apply function on foo 
    // or better without any arguments: 
    return old.call(this); // like this(); which is foo() 
} 
alert(foo.apply(null)); 

// and the call solution with an argument: 
foo.apply = function(context) { 
    return old.call(this, context); 
    // like this.call(context); 
    // which is foo.call(context) 
    // which is like context.foo() 
} 

還檢查了文檔的callapply「方法」(雖然我們已經使用old不是一個方法,而是作爲一個純函數)。

+0

Thx,這真的是信息:) – 2013-02-25 15:22:30