2012-04-28 26 views
5

私はjavascriptから始まり、特にOOPパターンを使用しています。javascriptのゲッターとセッター

私の質問は簡単です。 setterでは、パラメータとプライベートクラス変数の同じ名前を保持する方法はありますか?私はどこからでも見てきましたが、言及している人は見つかりませんでした。異なるvar名の例です。私は自分のコードで非常にうんざりです。私は2つの異なる名前を付けなければなりません。あなたがセッターでパラメータを参照することができますhttp://ejohn.org/blog/javascript-getters-and-setters/

function Field(val){ 
    this.value = val; 
} 
Field.prototype = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val; 
    } 
}; 

から例に取ると

はvalのですが、プロパティが実際の値です。それはjavascriptなので、this.value = valueを単に行うことはできません。なぜなら、 "this"を公開するからです。 value = valueは両方のパラメータを参照します(非常に奇妙です)。これを行う方法は本当にありませんか?そうでない場合、この状況には「ベストプラクティス」がありますか?私は下線が有効であるかもしれないと思うが、私はちょっとばかばかしいので、他に方法がないことを確認したい。

ありがとうございました!

答えて

5

クロージャを使用して変数を非表示にすることができます。コンストラクタMyClass終了後

function MyClass { 
    var value; 

    this.getValue = function() { 
    return value; 
    } 

    this.setValue = function(val) { 
    value = val; 
    } 

} 

それだけこのコンストラクタ(関数)にスコープしたように、valueフィールドは、una​​cessibleあります。だから、valueはプライベートフィールドだと言うかもしれません。しかし、方法getValue()setValue()は、構築されたオブジェクトから公にアクセス可能であり、変数範囲MyClassへの参照を保持しているので、それらは依然としてvalueを操作することができます。

+0

プロトタイプは素晴らしいですが、高速です。 –

+0

閉鎖は非常に興味深いです、ありがとう!それでも、パラメータとクラスvarのsetterで同じ変数名を使用することについての質問がありましたが、例ではまだ別の変数名を使用する必要があります。私はそれが可能である場合、両方のために同じ名前を使用する方法のためにロックされています。 javaのようなものはthis.variable-variableです(両方とも変数と呼ばれますが、最初はクラス変数を参照し、もう1つはパラメータ – yowie

+0

@AlexWayneを参照していますが、あなたは "hidden"変数を宣言できませんプロトタイプ...ここでは、コンストラクタは、関数の終了後にメモリに残る可変スコープを持つ関数です。プロトタイプは単なるオブジェクトであり、プロトタイプはどのように高速ですか? – Imp

1

クロージャを使用する:ここで

(function(exports){ 

    exports.field = {}; 
    var _value = '123'; 

    exports.field.get = function(){ 
     return _value; 
    } 

    exports.field.set = function(val){ 
     _value = val; 
    } 

})(window); 

console.log(field.get()); 

closures in JSに良いチュートリアルです。

関連する問題