在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
可以由用户直接访问/更改,而不需要通过value
的get/set方法。如何限制用户直接访问此属性(_value
)?
4条答案
按热度按时间ccrfmcuu1#
你也可以在TypeScript中使用
Object.defineProperty
。我修改了你的Field类,如下所示:
注意不能使用类本身定义的值,否则会递归调用字段的getter,直到遇到
Maximum call stack size exceeded
。类定义上的value:any
声明避免了编译器错误:字段类型值不存在属性“value
然后,您可以执行此TypeScript代码以获得与JavaScript代码示例相同的结果:
m4pnthwp2#
在TypeScript中,它应该像添加
private
修饰符一样简单(在您的示例中,_value
是公共的):...编译器现在应该阻止您从类外部设置属性:
但是这并没有在输出JS中以同样的方式隐藏
_value
。TypeScript私有成员仅在TS中是私有的。请参阅this answer和它链接到的有趣的codeplex discussion。cfh9epnr3#
使用
readonly
修饰符初始化它。这是一个更清晰的实现。
l7mqbcuq4#
如果你不创建一个变量,它将不可访问:
当然,我会建议删除所有设置在一起: