クリーンな外観を実装するための比較的単純だが効率的なメカニズムを探しています。
- public、private、および保護されたメンバー (実際の public/private/protected アクセスを使用しますが、拡張可能)
- 継承 (単一または複数)
- コンストラクターのオーバーロード (引数を数えたり、入れ子になった条件の複雑なセットで型をチェックしたりする必要がないことを好む)
クリーンな外観を実装するための比較的単純だが効率的なメカニズムを探しています。
よし、これを書く前にコーヒーを淹れた。私があなたを助けることができないのは、オーバーロードだけです。しかし、気にしないでください。
// Class pattern with
// - dynamic prototypes
// - public, private, static, static private members
// Keeps functions named the way you want it to.
// Working example:
var YourClass = (function(){
var Pseudo = function(){
var args = arguments;
// constuct the instance in here:
var YourClass = function(){
var public = this,
private = {};
public.foo = args[0] ? args[0] : "bar";
public.staticPrivateInt = ++static_private.someInt;
private.fibo = "nacci";
// fibo is private - return it's value
// with a getter to make it "protected"
public.getFibo = function(){
return private.fibo;
}
public.setFibo = function(value){
if(typeof value === "string"){
// handle optional events here
return private.fibo = value;
}else{
return false;
}
}
};
var static = Pseudo,
static_private = {};
// statics:
static_private.someInt = 100;
static.increaseSomeInt = function(){
++static_private.someInt;
}
// extend on creation of an instance:
YourClass.prototype = args[0] || new Object(); // or anything else, just an example
return new YourClass;
};
return Pseudo;
}());
使用法:
var myInstance = new YourClass({
someCfg: true
});
console.log(myInstance.someCfg === true); // will log true
JavaScript のレキシカル スコープとクロージャのおかげで、C++ や Java などの他の言語でクラスが設計されている方法を実際にシミュレートできます。
そのパターンを使用するときは、いくつかの点に注意してください。
static.private
、もはやプライベートではないため、保存しないでください (したがって、変数static_private
)。使い方
基本的に、あなたが望むものは次のとおりです。
public
でアクセスできるメンバー<object>.<member>
。Javascript では、通常はthis.<member> = <assignment>;
.
=> 便宜上、単純なエイリアスを作成します。
var public = this;
private
メンバーはコンストラクターで表示されますが、インスタンスでは表示されません。それでも、メソッドからアクセスできる必要がありますpublic
。
=>var private = {};
たとえば、単純な変数を作成して、より読みやすいvar fibo="nacci";
と思います。private.fibo="nacci";
キーワードで作成された変数var
は、コンストラクター関数の外側のスコープからはアクセスできません。
static
クラスのインスタンスがまだ作成されていない場合でも、メンバーを準備できます。JavaScript でこれを行う通常の方法は、値または関数をコンストラクター自体に割り当てることです。ここでSOの質問を参照してください
=> 繰り返しますが、読みやすくするために:
var static = Pseudo;
static private
members: コンストラクターの外では見えない静的メンバーが必要になる場合があります。
=>レキシカルスコープを使用してそれらを保存します。var static_private = {};
クラスパターンの詳細については、次を参照してください。