如何在JavaScript中冻结构造函数内的属性
我试图使构造函数中的属性不可变,也就是说,属性不应该用点或括号表示法进行更改。例如,我有我的构造函数:如何在JavaScript中冻结构造函数内的属性,javascript,Javascript,我试图使构造函数中的属性不可变,也就是说,属性不应该用点或括号表示法进行更改。例如,我有我的构造函数: function OnceNamedOne() { Object.freeze(this.firstName = 'John'); Object.freeze(this.lastName = 'Doe'); this.fullName = this.firstName + ' ' + this.lastName; } 我基本上想冻结属性并硬连接它们的值,就像在函数中一
function OnceNamedOne() {
Object.freeze(this.firstName = 'John');
Object.freeze(this.lastName = 'Doe');
this.fullName = this.firstName + ' ' + this.lastName;
}
我基本上想冻结属性并硬连接它们的值,就像在函数中一样。因此,创建实例时:
var me=new OnceNamedOne()
当我尝试更改属性值时,它不应该起作用-也就是说,不应该将“John”指定给first name:me.firstName='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});
}
参考资料:谢谢,我怎样才能将以上内容合并到我的代码中。我必须分开写吗?谢谢!那太棒了!非常感谢您的帮助。对于多个属性,您只需使用Object.defineProperties
。由于描述符属性将默认为false
无论如何,您只需要提供{value:…}
@Bergi-没错,我总是忘记它们默认为false
,而不是只附加属性,当它们为true
等时。您不想冻结属性,你冻结了一个物体。创建所有属性后,只需对整个实例调用freeze
!
function OnceNamedOne() {
Object.defineProperty(this, 'firstname', {value : 'John'});
Object.defineProperty(this, 'lastname', {value : 'Dow'});
Object.defineProperty(this, 'fullname', {value : this.firstname + ' ' + this.lastname});
}