Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使函数调用中的括号成为可选的_Javascript_Function_Object - Fatal编程技术网

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,

嘿,我即将重写JavaScript库的核心文件,我正在寻找更好的方法来完成所有事情。其中之一就是我如何使括号成为可选的,例如一些函数调用如下所示

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毫秒。所以我不认为这些性能问题是从哪里来的。此测试使用的方法可能会导致“轻微的性能和内存使用问题”