前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >闭包 && 原型变态真题

闭包 && 原型变态真题

原创
作者头像
剁椒鱼鳞
发布2023-06-07 11:29:02
2070
发布2023-06-07 11:29:02
举报
文章被收录于专栏:前端小学生前端小学生

在不修改以下代码的前提下,如何修改person对象

代码语言:javascript
复制
const obj = (function () {
    const person = {
        name: "Jerry",
        age: 18,
    }
    return {
        get: function (key) {
            return person[key];
        }
    }
})()
console.log('name--obj:', obj.get('name')); // Jerry
console.log('name--obj:', obj.get('age')); // 18
console.log('name--obj:', obj.get('address')); // undefined

通过以上代码可知,obj是个立即执行函数,内部一个闭包person,该立即执行函数返回了读取person对象的方法。

根据原型可知,当自身没有没有某个属性/方法时,就会往原型上查找,同时再运用object的get拦截方法,进而从中可找到破解该题的方法

代码语言:javascript
复制
Object.defineProperty(Object.prototype, 'sex', {
    get: function () {
        return {
            name: "Kitty",
            age: 32,
            sex: "Male",
        };
    }
})
console.log('sex--obj:', obj.get('sex')); // { name: 'Kitty', age: 32, sex: 'Male' }

当然,上述代码多少有点暴力,可简单优化下,每次访问Object时候,返回其本身:

代码语言:javascript
复制
Object.defineProperty(Object.prototype, 'sex', {
    get: function () {
        return this;
    }
})
const newObj = obj.get('sex');
newObj.sex = 'Boy'; // 不会新增属性
newObj.name = 'Tom';
console.log('sex--obj:', obj.get('sex')); // { name: 'Tom', age: 18 }

从上述代码可知,就是利用了原型的这么一个漏洞解决这个问题,那么问题来了,如何解决这个漏洞,获取对象属性的时候,判断下该属性是不是自由属性而非原型上的属性,上代码:

代码语言:javascript
复制
const obj = (function () {
    const person = {
        name: "Jerry",
        age: 18,
    }
    return {
        get: function (key) {
            if (Object.hasOwnProperty(key)) {
                return person[key];
            }
            return undefined;
        }
    }
})()

或者,定义对象时候规定对象没有原型

代码语言:javascript
复制
const obj = (function () {
    const person1 = {
        name: "Jerry",
        age: 18,
    }
    // Object.setPrototypeOf(person, null); // 方法一
    const person = Object.create(null, { // 方法二
        name: {
            value: "Jerry",
        },
        age: {
            value: 18,
        }
    })
    return {
        get: function (key) {
            return person[key];
        }
    }
})()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档