闭包的漏洞
var o = (function () {
var obj = {
a: 1,
b: 2
}
return {
get: function(k) {
return obj[k]
}
}
})()
这个函数就是一个通过传入属性值,来获取某个属性,这样就避免了直接修改其中属性的风险; 但实际上行有一个漏洞,可以通过如下方式,修改其中属性;
Object.defineProperty(Object.prototype, 'abc', {
get() {
return this;
}
})
此时我们就可以拿到obj这个对象了,此时就可以实现修改obj的成员属性了;
var obj2 = o.get('abc')
obj2.c = 2
obj2.a = '1111111111111'
console.log(o.get('a')) // 1111111111111
console.log(o.get('c')) // 2
如何避免该问题呢?需要在定义闭包时,判断传入的参数是否是obj对象自身上的属性(而非原型上的属性);
var o = (function () {
var obj = {
a: 1,
b: 2
}
return {
//get: function(k) {
// return obj[k]
//}
// 因此修改方案,需要修改为在给属性前,先判断一下有没有这个属性(在对象自己上,而非原型上的)
get: function(k) {
if(obj.hasOwnProperty(k)) {
return obj[k]
}
}
}
})()