只能从外面读,不能从里面读
Read-only from outside and not from inside
看看这个对象
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
不起作用,我只能用bob
对象的方法更改age
属性。
我在谷歌上搜索了一下,并设法设置了一个只读属性。
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
});
我不能用bob.age = 20
更改age
,但我也不能用该方法更改它。bob.growOld()
不会更改age
属性。我原以为将configurable
设置为true
会奏效,但事实并非如此。
有没有办法完成我在这里要做的事情?
JavaScript提供了许多方法,可能还有其他方法可以实现这一点,但我可以考虑使用Object.defineProperty和对象文字。
基本上,您将bob声明为公共变量,然后使用iife在创建私有变量("privateAge")的地方创建一个私有空间,然后向bob添加其他属性,这些属性本身是公共的,但也可以访问iife的范围。
接下来,在iife中,您使用object.properties将要公开的属性声明为只读("age"),并重新定义get
以返回privateAge,这是关键,不要定义set
,也不要在调用时定义它执行其他操作。
哦,我想我应该提到,当使用bob.age
时调用get,当bob.age
与赋值运算符(例如bob.age = 100
)一起使用时调用set
// 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
相关文章:
- 不能从angular2中的子组件指定父组件中的数组
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- 转义符不能与innerHTML一起使用
- JSON.parse没有'不能使用Javascript
- JS可以在Chrome中工作,但不能在Firefox中工作
- 砌体不能填补小缺口
- javascript扫雷器floodfill算法不能正常工作
- JavaScript指令不能像我想象的那样工作
- 为什么在这个网站上不能通过JS访问元素
- Facebook登录按钮没有'不能在Firefox上工作
- WebRTC视频聊天可以在FF中使用,但不能在Chrome中使用
- 为什么jQuery 1.8不能在IE8和InternetExplorer9中使用?(截至2012年9月的IE9最新版本)
- AngularJS:$q.dedefe()不能由工厂方法共享
- 不能在同一页上进行多个jquery幻灯片切换
- 不能在图像中的地图标记中使用花式框jquery插件的区域标记
- jQuery Datepicker可以在Safari中工作,但不能在FF或Chrome中工作
- javascript没有´我不能在joomla 3.0中工作
- 在ES6中,模块将导致多个网络调用,因为两个模块不能在单个文件中定义
- 只能从外面读,不能从里面读