2

Javascriptでは、get/setメソッドを使用してオブジェクトのプロパティを作成できます。

function Field(arg){
    var value = arg;

    // Create a read only property "name"
    Object.defineProperty(this, "value", {           
        get: function () {
            return value;
        },
        set: function () {
            console.log("cannot set");
        }
    });
}

var obj = new Field(10);    
console.log(obj.value); // 10
obj.value = 20;         // "cannot set"

valueここでは、プロパティの設定は許可されていません。

TypeScriptでは、同じ動作を実現したい場合は、これを実行する必要があります(TypeScriptでgetおよびsetで提案されているように)。

class Field {
    _value: number;

    constructor(arg) {
        this._value = arg;
    }

    get value() {
        return this._value;
    }

    set value() {
        console.log("cannot set");
    }
}

var obj = new Field(10);

console.log(obj.value); // 10
obj.value = 20;         // "cannot set"
obj._value = 20;        // ABLE TO CHANGE THE VALUE !
console.log(obj.value); // 20

ただし、ここに表示されている問題は、のget / setメソッドを使用せずに、ユーザーが直接、いわゆるプライベートプロパティ_valueにアクセス/変更できることですvalue_valueユーザーがこのプロパティ( )に直接アクセスするのを制限するにはどうすればよいですか?

4

3 に答える 3

4

Object.definePropertyTypeScriptでも使えます。

Field クラスを次のように変更しました。

class Field{
    value: any;
    constructor(arg: any)
    {
        var value = arg;
        Object.defineProperty(this, "value",{           
            get: () => {
                return value;
            },
            set: function () {
                console.log("cannot set");
            }
        });
    }
}

クラス自体で定義された値を使用できないことに注意してください。そうしないと、フィールドのゲッターが再帰的に呼び出され、Maximum call stack size exceeded. value:anyクラス定義の宣言により、コンパイラ エラーが回避されます。

プロパティ「値」はフィールド型の値に存在しません

次に、この TypeScript コードを実行して、JavaScript コード例と同じ結果を得ることができます。

var obj = new Field(10);
console.log(obj.value);
obj.value = 20;
于 2013-03-20T08:48:29.850 に答える
1

privateTypeScript内では、修飾子を追加するのと同じくらい簡単である必要があります(この例で_valueはpublicです)。

private _value:number;

...コンパイラは、クラスの外部からプロパティを設定できないようにする必要があります。

var obj = new Field(10);
obj._value = 20; // Error: The property '_value' does not exist on value of type 'Field'.

_valueしかし、これは出力JSで同じように隠れることはありません。TypeScriptプライベートメンバーはTS内でのみプライベートです。この回答と、それがリンクしている興味深いコードプレックスの議論を参照してください。

于 2013-03-20T07:47:13.380 に答える
-1

変数を作成しないと、アクセスできなくなります。

class Field{
    get value(){
        return 10;
    }

    set value(){
        console.log("cannot set");
    }
}

var obj = new Field();
console.log(obj.value); // 10
obj.value = 20;  // cannot set
console.log(obj.value); // 10 

もちろん、セットをまとめて削除することをお勧めします。

class Field{
    get value(){
        return 10;
    }
}
于 2013-03-20T04:11:23.043 に答える