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

时间:2019-01-17 09:50:30

标签: javascript eval reserved-words

我知道关于有效的标识符名称,属性名称,保留字等有几个问题,但是答案中有一些变化(以及很多冗长)。我只想知道一个非常具体情况的答案。

要使用名称eval的原因是,这是用于实际上将评估代码(使用另一种语言)的节点模块,因此感觉像是最合适的名称。

所以我的问题是:

我可以这样做吗?

function Foo() { ... }

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

还是在ES6中?

class Foo {
  ...

  eval(args) { ... }
}

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

2 个答案:

答案 0 :(得分:2)

eval不是reserved word。它仅仅是window上的一个属性,或者是globalThis上的任何属性(例如,Node上的global)。没有理由为什么不同对象(Foo的原型)上没有相同名称的属性。

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

function Foo(){}

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

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

更进一步,即使eval 是保留字,所有这些仍然有效。这是正确的,因为方法实际上可以具有任何名称:

class Foo{
  if(){}
}

new Foo().if();

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

如果它们是保留字,则不能单独使用它们,例如const if = new Foo().if;const {if} = new Foo();eval在这里很好;只会覆盖window.eval

答案 1 :(得分:0)

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

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

除此之外,您还可以做到。