闭包使用注意

44 阅读1分钟

闭包的漏洞

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]
             }
         }
    }
})()