1

プロトタイプを使用してJavaScriptオブジェクトのフィールドを設定する適切な方法を見つけようとしています。

私は以下を使用することができます:

function myData() {};
myData.prototype.a = null;
myData.prototype.b = null;
myData.prototype.c = null;

var data = new myData();
data.a = 1;
data.b = 2;
data.c = 3;

しかし、これはカプセル化のための適切なプロトコルに従っていないようです。

または、次のように実行できます。

function myData() {
    this._a = null;
    this._b = null;
    this._c = null;
};

myData.prototype.__defineGetter__("a", function() {
    return this._a;
});

myData.prototype.__defineSetter__("a", function(val) {
        this._a = val;
});

私のゲッターがプライベート変数の値を返しているだけで、それを使って何もしていない場合、このメソッドはやり過ぎのようです。

また、後でまで値がない場合は、コンストラクターで値をnullに設定するのは正しいですか?つまり、後で設定します。

4

2 に答える 2

3

JavaScriptは動的言語であり、これらのプロパティをカプセル化する必要がない場合は、厳密にカプセル化する必要はありません。したがって、最初の例は完全に問題ありません。

それ以外の場合、それらをカプセル化する必要があり、ES5準拠の環境にいる場合は、getandを使用する必要があります。これは、およびが非推奨であり、標準ではないためです(https://developer.mozilla.org/en/JavaScript/Reference/を参照set。 Global_Objects / Object /DefineGetterおよびhttps://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_getters_and_setters__defineGetter____defineSetter__

例:

function MyData() {
    // set to the prototype's value
    var a = this.a;
    var b = this.b;
    var c = this.c;

    Object.defineProperties(this, { 
        "a": {
            get : function(){ return a; },
            set : function(value) { a = value }
         },
         "b": {
            get : function(){ return b; },
            set : function(value) { b = value }
         },
         "c": {
            get : function(){ return c; },
            set : function(value) { c = value }
         }
    });
};

MyData.prototype.a = null;
MyData.prototype.b = null;
MyData.prototype.c = null;

Object.definePropertiesを参照してください

于 2012-06-06T01:18:44.663 に答える
0

JavaScript オブジェクトのフィールドを設定する適切な方法を見つけようとしています

「適切な」とはどういう意味かを定義する必要があります。

>  var data = new myData();
>  data.a = 1;
>  data.b = 2;
>  data.c = 3; 

a上記では、bcプロパティをdataオブジェクトに追加していますが、 myData.prototype.a(つまりdata[[Prototype]].a) などの値は変更していません。

しかし、これはカプセル化のための適切なプロトコルに従っていないようです。

それが何を意味するのか、つまり、上記が何を達成すべきだと考えているのかを説明する必要があります。

[中略__defineGetter____defineSetter__コード]

私のゲッターがプライベート変数の値を返すだけの場合、このメソッドはやり過ぎのようです

古典的な意味での「プライベート」変数は、ECMAScript には存在しません。ただし、クロージャーを使用してそれらをエミュレートできます。モジュールパターンを見てください。

于 2012-06-06T02:10:12.767 に答える