如何在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});
}