如何在不修改下面代码的情况下,
修改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
标签:闭包,function,abc,return,get,object,漏洞,var,obj From: https://www.cnblogs.com/webtown/p/17016597.html