2011-01-22 7 views
3

JavaScriptライブラリのコアファイルを書き直そうとしています。もっと良い方法を探しています。これらのうちの1つは、かっこを任意にする方法です。たとえば、いくつかの関数呼び出しは次のようになります。関数呼び出しのかっこを任意に設定する

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

+0

ああ申し訳ありませんが、私の例が示すように、私はブラケットの有無にかかわらず 'Spark'関数を使用する必要があります、私はすでに上記の方法でこれを達成しましたが、より良い、 – Olical

+0

はい、実際の要件は何ですか?なぜあなたがそれを呼び出すかどうかは関係ありません '火花'機能ですか?あなたは引数を持っているという事実を無視することができますか?あなたの解決策では、角括弧はオプションではなく、 'Spark'関数オブジェクトへの引数なしで' Spark'呼び出しの結果として生成されたオブジェクトのプロパティに混ざります。私は、デフォルトの 'Spark'オブジェクト(おそらく' DefSpark'または 'Spark.default')を持っているのとは対照的に、妥当なユースケースを見つけるのが難しいです。 –

答えて

1

あなたは正しい道を歩いていますが、注意してください。現時点では、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; 
})(); 
+0

* "...マイナーなパフォーマンスとメモリ使用の問題を引き起こします..." *必ずしもマイナーではありません。それは、どれくらいのものがあるかによって決まります。 –

+0

私はこのコードを試して、私が望むすべてのものにアクセスできるかどうか、仕事をしたように見えます。 – Olical

+0

@ T.J。 Crowder:あなたはもちろんそうです。パフォーマンスの低下は、準最適なコードが実行される頻度と、実行されるデータのサイズによって決まります。 ;-) –

0

はい、可能ですが、どうしてそうするのですか? JavaScriptを、VBやDelphiのような他のいくつかの言語のように見えるようにするには、関数のために括弧(角かっこは四角形のもの)を必要としませんか? JavaScriptの作成者は、パラメータの量に関係なく、カッコで関数を呼び出す必要があると判断しました。実際には、2つの文字をスキップするだけで関数の結果を参照するプロパティを作成しています。

あなたが実際に探しているものは、クラスかオブジェクトかと思います。あなたはこの記述することができます。今すぐ

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!'); 

これが唯一の小さな例ですが、あなたは本当にクラスを宣言して使用する方法についてお読みください、なぜならIそれがあなたが探しているものかもしれないと思います。

関連する問題