我试图使构造函数内的属性不可变,即不应使用点或括号表示法更改属性。例如。我有我的构造函数:
function OnceNamedOne() {
Object.freeze(this.firstName = 'John');
Object.freeze(this.lastName = 'Doe');
this.fullName = this.firstName + ' ' + this.lastName;
}
我基本上想要冻结属性并在函数中硬连接它们的值。因此,在创建实例时:
var me = new OnceNamedOne();
当我尝试更改属性值的值时,它应该不起作用 - 以下不应该分配' John'名字:me.firstName = 'John';
。
我怎么能这样做?
答案 0 :(得分:3)
您无法使用基元冻结属性,但可以将其设为non-writable
Object.defineProperty(this, 'firstname', {
enumerable : false,
configurable : false,
writable : false,
value : 'John'
});
对于多个属性,可能更容易创建便利功能
function createNonWritable(obj, key, value) {
Object.defineProperty(obj, key, {
enumerable : false,
configurable : false,
writable : false,
value : value
});
}
function OnceNamedOne() {
createNonWritable(this, 'firstname', 'John');
createNonWritable(this, 'lastname', 'Doe');
createNonWritable(this, 'fullname', this.firstname + ' ' + this.lastname);
}
或者如评论中所述,由于属性的默认值为false
,因此您无需将其明确设置为
function OnceNamedOne() {
Object.defineProperty(this, 'firstname', {value : 'John'});
Object.defineProperty(this, 'lastname', {value : 'Dow'});
Object.defineProperty(this, 'fullname', {value : this.firstname + ' ' + this.lastname});
}