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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律