2014-10-20 78 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