覆盖函数类型原型

时间:2018-02-07 08:48:54

标签: javascript function

在玩游戏并尝试覆盖Function原型时,我遇到了一个有趣的行为。

假设我们已经覆盖了toString(),如下所示:

const funcToString = Function.prototype.toString;
Function.prototype.toString = function() { 
    console.log("lol"); 
    return funcToString.call(this); 
}

现在,让我们采取行动,看看会发生什么:

(function foo(){}).toString(); // TypeError
  

TypeError:Function.prototype.toString要求' this'是一个功能

通过一些阅读,我了解到这与内部函数将其包装在代理中的方式有​​关 - 并且它与它的目标无法区分,会导致TypeError。

但现在,我们可以尝试这样做:

function boo(){};
boo.toString(); // prints "lol", as we wanted

要添加所有这些,我只在浏览器运行时中观察到此行为。在Node.js中,两种情况下一切都很顺利。

编辑:确认在REPL中工作没有任何错误。

就个人而言,我无法理解其中的区别是什么/究竟发生了什么。 如果有人能对此有所了解,将不胜感激。

1 个答案:

答案 0 :(得分:8)

这是缺少分号的问题:

Function.prototype.toString = function() { 
    …
}; /*
 ^ */
(function foo(){}).toString();

否则将其解释为

Function.prototype.toString = function(){…}(function foo(){}).toString();

调用应该像IIFE一样覆盖toString的函数表达式

… (function(){…}(function foo(){})) …

......在全球范围内,而不是在一个函数上。