2011-01-22 27 views
3

嘿,我即將重寫我的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(); 

這對我來說似乎是錯誤的,儘管這是我唯一想出來的作品。

+0

什麼是你要完成它? – Exelian 2011-01-22 10:40:16

+0

對不起,正如我的示例所示,我需要使用帶有或不帶括號的`Spark`函數,我已經通過上述方法完成了該操作,但是有更好,更清晰的方法。 – Olical 2011-01-22 10:42:59

回答

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

是的,這是可能的,但你爲什麼要這樣做?爲了讓JavaScript看起來像其他少數幾種語言(如VB和Delphi),不需要括號(括號是那些方形thingies)的函數? 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!'); 

這只是一個小例子,但你應該閱讀有關聲明和使用類,因爲我認爲這可能是你正在尋找的東西。

相關問題