如何在JavaScript中冻结构造函数内的属性

时间:2015-01-31 19:06:33

标签: javascript

我试图使构造函数内的属性不可变,即不应使用点或括号表示法更改属性。例如。我有我的构造函数:

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';

我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

您无法使用基元冻结属性,但可以将其设为non-writable

Object.defineProperty(this, 'firstname', {
  enumerable   : false,
  configurable : false,
  writable     : false,
  value        : 'John'
});

FIDDLE

对于多个属性,可能更容易创建便利功能

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);
}

FIDDLE

或者如评论中所述,由于属性的默认值为false,因此您无需将其明确设置为

function OnceNamedOne() {
    Object.defineProperty(this, 'firstname', {value : 'John'});
    Object.defineProperty(this, 'lastname',  {value : 'Dow'});
    Object.defineProperty(this, 'fullname',  {value : this.firstname + ' ' + this.lastname});
}