我想擴展Function.prototype
,但在一個新的原型上,我將其稱爲Func
。我想要這樣做來修改toString
方法。我一直在嘗試一些東西來實現這一點,但我似乎無法提出任何事情。這可以做到嗎,如果是這樣,那麼最好的辦法是什麼?在JavaScript中擴展`Function`
理想情況下,我想先做f = new Func(function() {})
,然後再撥打f.toString
來使用我的修改toString
方法。
我想擴展Function.prototype
,但在一個新的原型上,我將其稱爲Func
。我想要這樣做來修改toString
方法。我一直在嘗試一些東西來實現這一點,但我似乎無法提出任何事情。這可以做到嗎,如果是這樣,那麼最好的辦法是什麼?在JavaScript中擴展`Function`
理想情況下,我想先做f = new Func(function() {})
,然後再撥打f.toString
來使用我的修改toString
方法。
只是爲了關閉這個,我會說唯一的答案就是不要這樣做。我能夠找到其他方法來實現我的想法。
我有一個強感爲什麼?!對於這個問題,但你可以做這樣的:
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);
}
這不是我正在尋找的東西。我需要使用原型來提高效率。 – 2014-10-20 21:36:15
@RyanSmith:你不能(在ES5中),當參數'function(){}'被評估時,它的原型已經被分配了。但是上面沒有什麼效率不高的。我們不重複'Func $ toString'函數或類似的東西,只是給對象自己的屬性。對象獲得***許多屬性。 – 2014-10-20 21:39:11
這就是我的想法,沒關係。我認爲這裏值得一試。 – 2014-10-20 21:41:00
這是正常的原型繼承,你的'Func'從'Function'繼承'Func.prototype.toString' shadowing Function.toString - 有很多在線教程來教你如何編寫它,簡單的搜索爲「JavaScript繼承」 – 2014-10-20 21:32:53
@ Mike'Pomax'Kamermans我想看到一個JSFiddle。當我說我嘗試了一些東西時,我並不是在開玩笑。 – 2014-10-20 21:33:53
@ Mike'Pomax'Kamermans:哦,關於'新功能'沒有太多「正常」...... – 2014-10-20 21:34:03