防止在Javascript原型对象中更改属性的值

时间:2017-05-25 12:56:32

标签: javascript prototype

我有一个对象,我有一个名为“country”的属性作为爱尔兰。我想阻止开发人员在尝试在代码级别更新时更新属性。有没有机会这样做?如果是的话,请告诉我

var Car = function() {
            this.init();
            return this;
        }
        Car.prototype = {
            init : function() {

            },
            country: "Ireland",


        }

        var c = new Car();
        c.country = 'England';

我不希望国家被设置为爱尔兰以外的任何其他价值。我可以通过检查if条件来做到这一点。而不是条件,我可以有任何其他方式吗?

1 个答案:

答案 0 :(得分:2)

一种可能的方法是使用Object.defineProperty()init()中将此属性定义为不可写:

Car.prototype = {
  init: function() {
    Object.defineProperty(this, 'country', {
      value: this.country,
      enumerable: true, // false if you don't want seeing `country` in `for..of` and other iterations
      /* set by default, might want to specify this explicitly 
      configurable: false,
      writable: false
      */
    });
  },
  country: 'Ireland',
};

这种方法有一个非常有趣的特性:你可以通过原型调整属性,这将影响从那时起创建的所有对象:

var c1 = new Car();
c1.country = 'England';
console.log(c1.country); // Ireland
c1.__proto__.country = 'England'; 
console.log(c1.country); // Ireland
var c2 = new Car();
console.log(c2.country); // England

如果您不希望这种情况发生,请阻止修改Car.prototype,或将country转换为init函数的私有变量,如下所示:

Car.prototype = {
  init: function() {
    var country = 'Ireland'; 
    Object.defineProperty(this, 'country', {
      value: country,
    });
  }
};