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 @ 2022-12-31 14:04  未来的山大王  阅读(48)  评论(0)    收藏  举报