一、题目
获取下面闭包中的对象obj,并对其修改
const o = (function() {
const obj = {
name: "张三",
age: 35,
};
return {
get: function(k) {
return obj[k];
}
}
})();
console.log(`name:${o.get("name")}, age:${o.get("age")}`);
二、原型链
- 所有引用类型对象都有隐式原型__proto__;
- 查找引用类型上的属性时,如果本身没有,就会去其__proto__上查找;
- __proto__本身也是一个对象,其上查不到,会继续查找它的__proto__;
- 所有引用类型的根__proto__都是Object.prototype;
- 所有函数都有显示原型prototype;
- 所有引用类型的__proto__等于其构造函数的pototype;
const obj = {
num: 22
};
console.log(obj.__proto__ === Object.prototype); // 输出为true
三、解题
- 题中的闭包可以在obj中获取属性;
- 如果能给其上增加一个属性,其值返回obj本身即可拿到obj对象;
- 无法直接在obj上增加属性,那么可以在其原型__proto__上增加属性;
const o = (function() {
const obj = {
name: "张三",
age: 35,
};
return {
get: function(k) {
return obj[k];
}
}
})();
console.log(`name:${o.get("name")}, age:${o.get("age")}`); // name:张三, age:35
// 给原型增加属性
Object.defineProperty(Object.prototype, 'self', {
get: function() {
return this;
}
});
// 获取obj
const obj = o.get("self");
// 修改其值
obj.age = 22;
console.log(`name:${o.get("name")}, age:${o.get("age")}`); // name:张三, age:22