object原型-闭包“漏洞”

如何在不修改下面代码的情况下,
修改obj

复制代码
var o = (function () {
    var obj= {
        a: 'a1',
        b: 'b1'
    };
    return {
        get: function (key) {
            return obj[key]
        }
    }
})()
console.log(o.get('a')); // 'a1'
复制代码

方法

复制代码
Object.defineProperty(Object.prototype, 'abc', {
    get: function () {
        return this
    }
})
console.log(o.get('abc')); // { a: 'a1', b: 'b1' }
var obj2 = o.get('abc');
obj2.c = 'c1'
obj2.a = 'aaaaaaaa'
console.log(o.get('c')); // c1
console.log(o.get('a')); // aaaaaaaa
/* 这样闭包里的obj就被破坏了 */
复制代码
那如何不被破环
方法一,判断hasOwnProperty对象自身属性,这个方法可以用来检测一个对象是否含有特定的自身属性;该方法会忽略掉那些从原型链上继承到的属性
复制代码
var o = (function () {
    var obj= {
        a: 'a1',
        b: 'b1'
    };
    return {
        get: function (key) {
            if(obj.hasOwnProperty(key)) {
                return obj[key]
            } else {
                return undefined
            }
        }
    }
})()
Object.defineProperty(Object.prototype, 'abc', {
    get: function () {
        return this
    }
})
console.log(o.get('abc')); // undefind
复制代码
方法二,setPrototypeOf
复制代码
var o= (function () {
    var obj= {
        a: 'a1',
        b: 'b1'
    };
    Object.setPrototypeOf(obj, null)
    return {
        get: function (key) {
            return obj[key]
        }
    }
})()
Object.defineProperty(Object.prototype, 'abc', {
    get: function () {
        return this
    }
})
var obj2 = o.get('abc');
obj2.c = 'c1' // Cannot set properties of undefined
console.log(o.get('abc')); // undefined
复制代码

 

posted @   未来的山大王  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示