是否有可能以任何方式做这样的事情:
function A() {
var Loaded = 'loaded';
raise Loaded;
}
function A_raise(evt) {
console.log(evt);
}
A.prototype.constructor = A;
A.prototype.raise = A_raise;
关键部分是这条线:
raise Loaded;
是否有可能以任何方式做这样的事情:
function A() {
var Loaded = 'loaded';
raise Loaded;
}
function A_raise(evt) {
console.log(evt);
}
A.prototype.constructor = A;
A.prototype.raise = A_raise;
关键部分是这条线:
raise Loaded;
在 JavaScript 中获得无括号函数调用的唯一方法是定义一个 setter/getter 属性,或覆盖其中一种特殊方法:toString
或valueOf
。在这两种情况下,您都无法很好地控制传递给调用的参数。
function C() {}
C.prototype.valueOf = function () { alert("valueOf called"); };
var c = new C();
// No parentheses
+c;
您可以调用不带括号的构造函数,但同样不能传递参数。
function f() { alert("f"); }
// No parentheses
new f
你不能的一个原因是分号插入。
f()
是一个函数调用,原样
f
()
和
if
(x) { }
是一个有效的条件,因为if
它是语言的核心部分,但如果你可以从函数调用中删除括号,那么分号插入将不得不像这样对待代码
var x = raise
y
作为初始化为调用函数的结果的变量。
由于您询问了语言扩展,EcmaScript 规范的第 16 章说允许解释器添加到语言的语法中,
实现可以扩展程序语法和正则表达式模式或标志语法。为了允许这一点,所有允许抛出 SyntaxError 的操作(例如调用 eval、使用正则表达式文字或使用 Function 或 RegExp 构造函数)都被允许展示实现定义的行为,而不是在遇到实现时抛出 SyntaxError -程序语法或正则表达式模式或标志语法的定义扩展。
所以自从
raise foo
不是语言中的有效表达式或语句,他们可以允许,但他们不能以改变含义的方式这样做
raise
foo
必须具有相同的含义
raise;
foo
所以口译员将不得不做出raise
一个新的受限制的生产,这是由于措辞而有问题的:
以下是语法中唯一受限制的产生式:
这可能意味着不规范,但并非明确如此。
你不能在 JavaScript 中定义新的语句,所以你实际上不能创建你在A
.
编辑:从您对问题的评论中,很明显您正在寻找定义一个新的语句/关键字。不,你不能那样做。
原始答案:
您的目标是在A
构造函数中调用该A_raise
函数吗?如果是这样,你真的很接近。只是改变:
raise Loaded;
至
this.raise(Loaded);
在通过new
关键字对构造函数的调用中,this
是新构造的对象,它已经从构造函数的prototype
属性中接收了它的原型。So this
will have raise
on it (通过它的原型),raise
并将参考A_raise
函数。
但同样,您需要括号(和this.
)。