2014-10-20 75 views
-1

我想擴展Function.prototype,但在一個新的原型上,我將其稱爲Func。我想要這樣做來修改toString方法。我一直在嘗試一些東西來實現這一點,但我似乎無法提出任何事情。這可以做到嗎,如果是這樣,那麼最好的辦法是什麼?在JavaScript中擴展`Function`

理想情況下,我想先做f = new Func(function() {}),然後再撥打f.toString來使用我的修改toString方法。

+0

這是正常的原型繼承,你的'Func'從'Function'繼承'Func.prototype.toString' shadowing Function.toString - 有很多在線教程來教你如何編寫它,簡單的搜索爲「JavaScript繼承」 – 2014-10-20 21:32:53

+0

@ Mike'Pomax'Kamermans我想看到一個JSFiddle。當我說我嘗試了一些東西時,我並不是在開玩笑。 – 2014-10-20 21:33:53

+2

@ Mike'Pomax'Kamermans:哦,關於'新功能'沒有太多「正常」...... – 2014-10-20 21:34:03

回答

0

只是爲了關閉這個,我會說唯一的答案就是不要這樣做。我能夠找到其他方法來實現我的想法。

0

我有一個爲什麼?!對於這個問題,但你可以做這樣的:

function Func(f) { 
    f.toString = Func$toString; 
    return f; 
} 

...其中Func$toString是你toString實現。

例子:

function Func$toString() { 
 
    return "Special! " + Function.prototype.toString.call(this); 
 
} 
 
function Func(f) { 
 
    f.toString = Func$toString; 
 
    return f; 
 
} 
 

 
var f = new Func(function() {}); 
 
display(f); // "Special! function() {}" 
 

 
function display(msg) { 
 
    var p = document.createElement('p'); 
 
    p.innerHTML = String(msg); 
 
    document.body.appendChild(p); 
 
}


或者,當然了,如果你感覺真的很大膽,只需更換Function.prototype.toString

var oldToString = Function.prototype.toString; 
 
Function.prototype.toString = function() { 
 
    return "Special! " + oldToString.call(this); 
 
}; 
 

 
var f = function() {}; 
 
display(f); // "Special! function() {}" 
 

 
function display(msg) { 
 
    var p = document.createElement('p'); 
 
    p.innerHTML = String(msg); 
 
    document.body.appendChild(p); 
 
}

+0

這不是我正在尋找的東西。我需要使用原型來提高效率。 – 2014-10-20 21:36:15

+1

@RyanSmith:你不能(在ES5中),當參數'function(){}'被評估時,它的原型已經被分配了。但是上面沒有什麼效率不高的。我們不重複'Func $ toString'函數或類似的東西,只是給對象自己的屬性。對象獲得***許多屬性。 – 2014-10-20 21:39:11

+0

這就是我的想法,沒關係。我認爲這裏值得一試。 – 2014-10-20 21:41:00