使函数调用中的括号可选

时间:2011-01-22 10:35:49

标签: javascript function object

嘿,我即将重写我的JavaScript库的核心文件,我正在寻找更好的方法来做所有事情。其中一个是如何使括号可选,例如一些函数调用看起来像这样。

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();

这对我来说似乎不对,虽然这是我提出的唯一可行的方法。

2 个答案:

答案 0 :(得分:1)

你走在正确的道路上,但要小心。就目前而言,每次调用fn时都会实例化Spark(...)函数,这会导致较小的性能和内存使用问题。

更简洁的方法是使用类并将所有这些函数存储在原型中以避免不必要的内存使用:

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;
})();

答案 1 :(得分:0)

是的,这是可能的,但你为什么要那样做?为了使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!');

这只是一个小例子,但您应该真正阅读有关声明和使用类的内容,因为我认为这可能是您正在寻找的内容。