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 中,如果我想实现相同的行为,我必须这样做(如get and set in TypeScript所建议的那样):

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

但是你在这里看到的问题是,所谓的私有属性_value可以被用户直接访问/更改,而无需通过 get/set 方法value。如何限制用户_value直接访问此属性 ( )?

4

3 回答 3

4

你也可以Object.defineProperty在 TypeScript 中使用。

我已经修改了您的 Field 类,例如:

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

请注意,您不能使用在类本身上定义的值,否则该字段的 getter 将被递归调用,直到您遇到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

在 TypeScript 中,它应该像添加private修饰符一样简单(在您的示例中,_value是公共的):

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 中是私有的。请参阅此答案及其链接到的有趣的codeplex 讨论。

于 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 回答