0

クリーンな外観を実装するための比較的単純だが効率的なメカニズムを探しています。

  • public、private、および保護されたメンバー (実際の public/private/protected アクセスを使用しますが、拡張可能)
  • 継承 (単一または複数)
  • コンストラクターのオーバーロード (引数を数えたり、入れ子になった条件の複雑なセットで型をチェックしたりする必要がないことを好む)
4

1 に答える 1

1

よし、これを書く前にコーヒーを淹れた。私があなたを助けることができないのは、オーバーロードだけです。しかし、気にしないでください。

// 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 などの他の言語でクラスが設計されている方法を実際にシミュレートできます。

そのパターンを使用するときは、いくつかの点に注意してください。

  1. 厳密モードでは、static、private、public などの変数名によってエラーが発生します。必要に応じて名前を変更できます。
  2. 静的なプライベート変数はstatic.private、もはやプライベートではないため、保存しないでください (したがって、変数static_private)。

使い方

基本的に、あなたが望むものは次のとおりです。

  1. publicでアクセスできるメンバー<object>.<member>。Javascript では、通常はthis.<member> = <assignment>;.

    => 便宜上、単純なエイリアスを作成します。 var public = this;

  2. privateメンバーはコンストラクターで表示されますが、インスタンスでは表示されません。それでも、メソッドからアクセスできる必要がありますpublic

    =>var private = {}; たとえば、単純な変数を作成して、より読みやすいvar fibo="nacci";と思います。private.fibo="nacci";キーワードで作成された変数varは、コンストラクター関数の外側のスコープからはアクセスできません。

  3. staticクラスのインスタンスがまだ作成されていない場合でも、メンバーを準備できます。JavaScript でこれを行う通常の方法は、値または関数をコンストラクター自体に割り当てることです。ここでSOの質問を参照してください

    => 繰り返しますが、読みやすくするために: var static = Pseudo;

  4. static privatemembers: コンストラクターの外では見えない静的メンバーが必要になる場合があります。

    =>レキシカルスコープを使用してそれらを保存します。var static_private = {};

クラスパターンの詳細については、次を参照してください。

于 2013-02-17T05:40:37.510 に答える