【高级-好题】修改闭包对象

题目描述

const object = (function () {
  const obj = {
    a: 1,
    b: 2,
  };

  return {
    get: function (key) {
      return obj[key];
    },
  };
})();

object.get('a'); // 1

// 在这里实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

如何在不改变上面代码的情况下,修改obj对象,比如给obj添加一个属性c: 3

实现误区

试图通过valueOf方法获取到obj对象自身,但是valueOf要通过obj.valueOf才能调用,先取出valueOf函数无法绑定this

object.get('valueOf')();
1

解题思路

Object.defineProperty(Object.prototype, 'abc', {
    get() {
        return this;
    }
})

const obj = object.get('abc');
obj.c = 3;
1
2
3
4
5
6
7
8

如何不让外部修改闭包对象?

const object = (function () {
    const obj = {
        a: 1,
        b: 2,
    };

    return {
        get: function (key) {
            if (obj.hasOwnProperty(key)) {
                return obj[key]
            }
            return undefined
        },
    };
})();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15