看一下这个对象
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}}可以解决问题,但事实并非如此。
有没有办法完成我在这里尝试做的事情?
答案 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