在 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
。
除此之外,你也可以做到。
我知道有几个关于有效标识符名称、属性 名称、保留字等的问题,但答案有一些变化(而且很冗长)。我只想知道一个非常具体的案例的答案。
之所以要使用这个名字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
。
除此之外,你也可以做到。