源代码:要求:不修改obj内内容,改变obj
var object1 = (function () {
var obj = {
a: 1,
b: 2,
};
return {
get: function (k) {
return obj[k];
},
};
})();
答案:
Object.defineProperty(Object.prototype, "abc", {
get() {
return this;
},
});
var obj2 = object1.get("abc");
obj2.c = 2;
使用Object.defineProperty为object1 的Object.prototype添加另一个属性,利用返回值是this的bug修改obj
防止这种情况
1.在get函数中添加判断,判断k是不是obj的属性,不是的话返回undefinef
return {
get: function (k) {
if (obj.hasOwnProperty(k)) {
return obj[k];
}
return undefined;
},
};
2.如果用不到obj原型上的任何东西的话,就用
Object.setPrototypeOf(obj, null);
设置原型为空此时代码变为
var object1 = (function () {
var obj = {
a: 1,
b: 2,
};
Object.setPrototypeOf(obj, null);
return {
get: function (k) {
return obj[k];
},
};
})();