覆盖函数类型原型

Kam*_*cki 2 javascript function

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

我们假设我们像这样重写toString():

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

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

(function foo(){}).toString(); // TypeError
Run Code Online (Sandbox Code Playgroud)

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

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

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

function boo(){};
boo.toString(); // prints "lol", as we wanted
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ber*_*rgi 8

这是一个缺少分号的问题:

Function.prototype.toString = function() { 
    …
}; /*
 ^ */
(function foo(){}).toString();
Run Code Online (Sandbox Code Playgroud)

否则它被解释为

Function.prototype.toString = function(){…}(function foo(){}).toString();
Run Code Online (Sandbox Code Playgroud)

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

… (function(){…}(function foo(){})) …
Run Code Online (Sandbox Code Playgroud)

......在全球范围内,而不是在一个功能上.

  • @Bergi如果我在我的环境中使用linter设置了它.但是,嘿,告诉那些反对分号的人总是一件好事! (3认同)
  • 我没有看到这一点. (2认同)
  • @KamilSolecki反对分号的人知道把一个放在以`(`,即`;(function foo(){})开头的行的开头.toString()`:-) (2认同)