11

プライベートプロパティを使用したオブジェクト作成パターンを検討する場合、1つの方法は次のとおりです。

function MyStack (){
    var list = [],
        index = 0;

    this.push =  function(val){ 
        return list[index++] = val;
    };
    this.pop = function(){// ...}
}

var stack1 = new MyStack();       stack1.push(5);
var stack2 = new MyStack();       stack2.push(11);

これに関する問題:Stackのすべてのインスタンスには、メソッド「push」および「pop」の独自のコピーがあります。

コンストラクターメソッドを実装する別の方法は次のとおりです。

function MyStack(){ 
    this.list = []; 
    this.index = 0;
}
MyStack.prototype = {
    insert: function(val){
            return this.list[this.index++] = val;
        },
    pop:function(){//...}
}

ここでの問題:リストとインデックスのプライバシーが失われます。

インスタンス間でメソッドを再利用し、プロパティのプライバシーを保護する方法はありますか?

オブジェクトのどの状態でも動作しないメソッドに対してこれを使用できることは理解していますが、状態で動作するメソッドについて詳しく説明しています。

4

4 に答える 4

1

コンストラクター関数は任意のオブジェクトを返すことができます(必ずしもこれではありません)。「実際の」インスタンスオブジェクトの「実際の」メソッドへのプロキシメソッドを含む、プロキシオブジェクトを返すコンストラクター関数を作成できます。これは複雑に聞こえるかもしれませんが、そうではありません。コードスニペットは次のとおりです。

var MyClass = function() {
    var instanceObj = this;
    var proxyObj = {
        myPublicMethod: function() {
            return instanceObj.myPublicMethod.apply(instanceObj, arguments);
        }
    }
    return proxyObj;
};
MyClass.prototype = {
    _myPrivateMethod: function() {
        ...
    },
    myPublicMethod: function() {
        ...
    }
};

良い点は、保護されたメソッドに名前を付けるための規則を定義すれば、プロキシの作成を自動化できることです。私はまさにこれを行う小さなライブラリを作成しました:http://idya.github.com/oolib/

于 2012-11-26T02:09:16.027 に答える
1

JohnResigのSimpleJavascriptInheritanceを確認する必要がありますこれは素晴らしい読み物であり、 Privates.jsと呼ばれるプライベートのサポートを提供するように拡張されています。

于 2012-10-09T23:36:15.213 に答える
1

はい。このコードを編集したので、意図したとおりに実際に完全に機能します。私には少し冗長に思えますが、パブリックインターフェイスを提供する機能を提供しますが、変数をプライベートに保ち、ユーザーが変数を操作する方法を制御します。

function MyStack(){ 
    var list = []; 
    var index = 0;

    this.getIndex = function(){
        return index;
    }
    this.setIndex = function(val){
        index = val;
    }
    this.list = function(val){
        if(val){
           // setter if a value was provided. Illustrating how you can control
           // index, which I assume is the point of having these things private 
           // to begin with
           return list[this.setIndex(this.getIndex() + 1)] = val;
        }

        // always return list - acts like a getter
        return list;
    }
}
MyStack.prototype = {
    insert: function(val){
            return this.list(val);
        },
    pop:function(){}
}

var stack1 = new MyStack();       
stack1.insert(5);
var stack2 = new MyStack();       
stack2.insert(11);
于 2012-11-26T02:34:00.353 に答える
0

あなたが言及した両方のアプローチで、コンストラクターパターンを使用してオブジェクトが作成されると、プロパティはそのオブジェクトにコピーされると思います。これは、最初のアプローチで懸念事項として言及しました。このアプローチに対するあなたの懸念とともに、同じことが2番目のアプローチにも当てはまると思います。

「MyStack」のプロパティを他のクラスに拡張したい場合は、通常、2番目のアプローチに進みます。

以下のように、クラスMyStackをMyTestに拡張したいとします。

var dummy = function();
dummy.prototype = MyStack.prototype;
var MyTest = function(){
};
MyTest.prototype = new dummy(); // Assigning MyStack properties to MyTest
var obj = new MyTest();
于 2012-10-02T09:43:16.210 に答える