来自外部而不是内部的只读

时间:2015-02-04 03:10:59

标签: javascript object properties readonly

看一下这个对象

var bob = {
    name    : "Bob",
    age     : 18,
    talk    : function() {
        console.log("hi");
    },
    growOld : function() {
        this.age += 30;
    }
}

我可以访问bob.age并使用bob.growOld()。但是,如果我希望bob.age从外部读取并从内部读取,该怎么办?例如,bob.age = 20无法正常工作,我只能使用age对象的方法更改bob属性。

我做了一些谷歌搜索并设法设置了一个只读属性。

var bob = {
    name    : "Bob",
    talk    : function() {
        console.log("hi");
    },
    growOld : function() {
        this.age += 30;
    }
}

Object.defineProperty(bob, "age", {
    enumerable      : false,
    configurable    : false,
    writable        : false,
    value           : 18
});

我无法使用age更改bob.age = 20,但我也无法使用该方法更改bob.growOld()age并未更改configurable属性。我认为将true设置为{{1}}可以解决问题,但事实并非如此。

有没有办法完成我在这里尝试做的事情?

1 个答案:

答案 0 :(得分:0)

JavaScript提供了许多方法来完成这项工作,并且可能有其他方法可以实现这一点,但这是我可以想到使用Object.defineProperty和对象文字的方式。

基本上你将bob声明为公共变量,然后使用iife在你创建私有变量(" privateAge")的内部创建一个私有空间,然后将其他属性添加到bob这本身就是公开的,但也可以进入生活的范围。

接下来,在iife中,您使用object.property将要公开的属性声明为只读(' age'),然后重新定义get以返回privateAge,并且是关键,不要定义set或定义它在调用时做其他事情。

哦,我想我应该提一下,当使用bob.age时调用get,并且当bob.age与赋值运算符一起使用时调用set(例如bob.age = 100)< / p>

// Public out here
var bob;
// This is the iife
(function() {
  // Private in here
  var privateAge = 17;
  bob = {
    name    : "Bob",
    talk    : function() {
        console.log("hi");
    },
    growOld : function() {
        privateAge += 30;
    }
  }

  Object.defineProperty(bob, "age", {
    get: function() { return privateAge; },
    set: function(newValue) { 
      // This is how read only from the out side is achieved
      // You could throw an error here or just omit set completely
      console.log("Not yours!");
    } 
  });

}());

console.log(bob.age)  // 17
console.log(bob.privateAge) // undefined
bob.age = 100 // Not yours!
console.log(bob.age) // still 17
bob.growOld(); 
console.log(bob.age) // 47