Javascript 使函数调用中的括号成为可选的
嘿,我即将重写JavaScript库的核心文件,我正在寻找更好的方法来完成所有事情。其中之一就是我如何使括号成为可选的,例如一些函数调用如下所示Javascript 使函数调用中的括号成为可选的,javascript,function,object,Javascript,Function,Object,嘿,我即将重写JavaScript库的核心文件,我正在寻找更好的方法来完成所有事情。其中之一就是我如何使括号成为可选的,例如一些函数调用如下所示 Spark('p').content('Hello, World'); Spark.browser(); 还有其他类似的 Spark('p').content('Hello, World'); Spark.browser(); 所以我有Spark函数的可选括号。我说这是最好的办法,对吗 window.Spark = function(arg1,
Spark('p').content('Hello, World');
Spark.browser();
还有其他类似的
Spark('p').content('Hello, World');
Spark.browser();
所以我有Spark函数的可选括号。我说这是最好的办法,对吗
window.Spark = function(arg1, arg2) {
return {
fn: function() {
alert('run');
}
};
};
for(var f in Spark())
Spark[f] = Spark()[f];
Spark.fn();
Spark(true, false).fn();
虽然这是我想出的唯一有效的方法,但我觉得这似乎不对。是的,这是可能的,但你为什么要这样做?要使JavaScript看起来像其他几种不需要括号(括号是正方形)的语言(如VB和Delphi)吗? JavaScript的创建者决定,不管参数的数量如何,都应该使用括号调用函数。实际上,您正在创建引用函数结果的属性,只是为了跳过两个字符 我认为你实际上在寻找的是一个类或对象。你可以这样写:
function MyClass(Parameter /*optional*/)
{
// Initialization (optional)
this.anyProperty = parameter;
this.anyMethod = function(p)
{
alert(p);
}
}
// Or declare methods like this (faster and more efficient)
MyClass.prototype.anyMethod2 = function(p)
{
alert(p);
}
现在,您可以实例化该类并调用方法:
var c = new MyClass;
c.anyMethod2('Hello world!');
这只是一个小例子,但您确实应该阅读有关声明和使用类的内容,因为我认为这可能就是您要寻找的内容。您走的路是对的,但要小心。目前,每次调用
Spark(…)
时,fn
函数都将被实例化,这将导致较小的性能和内存使用问题
更干净的方法是使用一个类并将所有这些函数存储在原型中,以避免不必要的内存使用:
window.Spark = (function(){
function inner(arg1, arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
}
inner.prototype = {
fn : function() { alert('run') }
};
function S(arg1, arg2) { return new inner(arg1, arg2) }
var dflt = S();
for (var f in dflt) S[f] = dflt[f];
return S;
})();
你想实现什么?哦,对不起,正如我的示例所示,我需要使用带括号或不带括号的
Spark
函数,我已经通过上面的方法实现了这一点,但是否有更好、更干净的方法。是的,但退一步,实际要求是什么?如果调用它与否无关,为什么Spark
是一个函数?如果你能忽略它有论点的事实?您的解决方案没有使括号成为可选的,它只是将调用Spark
生成的对象的属性混合到Spark
函数对象中,没有参数。我很难找到一个合理的用例,而不是一个默认的Spark
对象(可能是defsark
或者甚至Spark.default
)。嗯,我不太确定。为什么要使括号成为可选的?如果你可以运行Spark.browser
函数而不需要附加大括号,那么我认为你运气不好。不,我想选择的是Spark
必需的括号,而不是它的函数。“…这会导致较小的性能和内存使用问题…”不一定是较小的。这取决于这些东西将有多少。我仍在试验这个代码,看看我是否可以访问我想要的一切,看起来它已经完成了任务,如果它完成了,我会接受的。@T.J.克劳德:当然,你是对的。性能下降始终取决于次优代码的运行频率及其运行数据的大小。;-)为了澄清,我做了一些基本测试,初始化时间<1毫秒。所以我不认为这些性能问题是从哪里来的。此测试使用的方法可能会导致“轻微的性能和内存使用问题”