在 JavaScript 或 NodeJS 中使用 eval 作为原型方法名

Using eval as prototype method name in JavaScript or NodeJS

我知道有几个关于有效标识符名称、属性 名称、保留字等的问题,但答案有一些变化(而且很冗长)。我只想知道一个非常具体的案例的答案。

之所以要使用这个名字eval,是因为这是一个节点模块,它会实际计算代码(用另一种语言),所以感觉这个名字是最合适的。

所以我的问题是:

我可以这样做吗?

function Foo() { ... }

Foo.prototype.eval = function(args) { ... }

或者在 ES6 中,这个?

class Foo {
  ...

  eval(args) { ... }
}

假设这在技术上是有效的,那么缺点是什么?

eval 不是 reserved word。它只是 window 上的 属性 或 globalThis 上的任何东西(例如 global 在 Node 上)。 不同的对象(Foo的原型)没有理由不能有同名的属性。

所有这些都是有效的,并且所有这些都在 some 对象上创建了一个带有键 eval 的 属性:

function Foo(){}

Foo.prototype.eval = function(){};
new Foo().eval();
class Foo{
  eval(){}
}

new Foo().eval();
({
  eval: function(){}
}).eval();

更进一步,即使 eval 保留字,所有这些仍然有效。这是有效的,因为方法实际上可以有 any name:

class Foo{
  if(){}
}

new Foo().if();

({
  if(){},
  var(){},
  for(){},
  switch(){}
}).var();

你不能单独使用它们,比如 const if = new Foo().if;const {if} = new Foo();,如果它们是保留字。 eval 在这里没问题;它只会覆盖 window.eval.

这是有效的,eval是全局对象的属性(在浏览器中为window或在node.js中为global

作为缺点,我能看到的主要缺点是 开发人员的惊讶 看到一些 eval,有点害怕/将其与全球知名 eval

除此之外,你也可以做到。