2011-08-10 22 views
3

私は現在Spineに潜入しています。私は現在、Spineのクラス作成メソッドを使ってプライベート関数を定義する最もエレガントな方法を尋ねています。Spineのプライベート "クラス"関数を定義するもっともエレガントな方法

var PrinterManager = Spine.Class.create({ 

    init: function() { 

    }, 

    getAllAvailablePrinters: function() { 

    }, 

    printDocument: function() { 

    } 

}); 

(function() { 

    var instantiateActiveX = function(){ 
     console.log("..."); 
    } 

    PrinterManager.include({ 
     pubInitActiveXPrinter: function(){ 
      instantiateActiveX(); 
     } 
    }); 

})(); 

あなたは私がinstantiateActiveXはプライベートと外から見えないようにしたい見ることができるように。 JavaScriptのクロージャー機能のトリックを使用すると、私は問題なくプライベートにすることができますが、このソリューションはSpineのようなクラスを作成するコンテストではあまりにもエレガントではないようです。

コードは動作します。つまり、私はPrinterManager.init().pubInitActiveXPrinter()に電話をかけ、内部でプライベート機能を呼び出し、正しく - PrinterManager.init().instantiateActiveX()に電話をかけることができません。

私の質問 - 私はまだ発見していないスパインでそれを行うよりエレガントな方法はありますか?

答えて

0

簡単に言えば、グローバルスコープから一部の関数/変数invisible/privateを作成するクロージャ以外の方法はありません。

+0

確かに、プライベートスコープを "エミュレート"するにはJavaScriptで閉じる必要があります。それは明らかです。私の反対はSpineに関するものでした。著者は純粋な従来の仕組みに頼っているようですが、それはプライベートスコープをエミュレートするほど安全ではないかもしれません。上記の仕組みは "instantiateActiveX()"が "public"ではないので完全に機能しますが、それを統合するのはかなり面倒です... – Juri

+0

クロージャを使用する以外にプライベートとして宣言する方法がないことは明らかです。あなたの質問に対する答えは1つだけです。もちろん、他の関数を宣言することができる十数の方法がありますが、実際の機能変更よりもマークアップの方が重要です。何がエレガントなものに見えるかは、誰かにとって必ずしもエレガントではない。 – WTK

0

"private"関数は存在しません。ローカル関数とクロージャー状態のみがあります。また、ローカルの関数/変数とステートのクロージャを使用しても、プロトタイプの継承を使用することはできません。

あなたが求めているはずの本当の疑問は、なぜあなたは私的な機能が必要なのかということです。

機能が不安定であり、APIは、誰もがこれらの内部関数や変数を使用している場合、彼らは文句を言う権利はない_

var PrinterManager = { 
    ... 
    _instantiateActiveX: function() { 
     ... 
    } 
} 

でそれを付加だけで変更される可能性があるため使用すべきではない場合コードを変更するとコードが壊れます。

+2

下線付きの関数は、単に規約に過ぎず、誰もグローバルスコープからの使用を止めません。他の言語でプライベート/プロテクトされた修飾語がある理由があります。 – WTK

+0

@WTKなぜですか?なぜあなたは私的な機能が必要ですか? – Raynos

+0

グローバルスコープからコードを隠し、オブジェクトの状態を変更するpublic * *エントリポイントのみを提供するには。 – WTK

関連する問題