例如下面代码中 如何不修改其本身 去更改obj的值?
let o =(function () {
var obj = { a:1, b:2, };
return { get:function(k){
return obj[k]
}
}
})()
我们使用这种闭包的原因就是为了使用函数值,并且保护函数值不被修改,就算要修改函数值也要定义一个修改函数,通过修改函数修改值。 但是这里面也没有修改函数 只有一个获取函数,它可以返回对象内属性的值。 我们通过这个函数可以得到对象内属性的值。
console.log(o.get('a'));// 可以获取到1 obj中a属性的值。
我们想要修改函数值,那么可以尝试先获取到这个函数,所以我想到使用valueOf这个方法来获取到原对象的内容,Object 实例的 valueOf() 方法将 this 值转换成对象。
console.log(o.get('valueOf')()); //不过结果报错了 并没有获取到。
原因就是this指向问题 return obj[valueOf] 返回来的函数,就是在全局环境执行的,this指向就是window所以报错 就跟Object.prototype.valueOf()一样。 由于要求不能修改试题,所以我们只能找别的方法,但是这个思路是没有问题的。
我们的目标还是想办法通过给的get函数获取原对象,我们可以这里在对象原型上自定义一个方法。
Object.defineProperty(Object.prototype,'getThis',{
get(){
return this;
},
})
//我们直接在对象的原型上定义一个方法,只要调用getThis就会执行get函数 返回this。
//我们只需要执行就能得到原对象, 也就是return obj['getThis'] 函数内返回的this就是obj,这样就得到了对象。
console.log(o.get('getThis'));
//{ a: 1, b: 2 } //这时候就可以通过对象的引用特性,对原对象进行随意修改了 obj2=o.get('getThis') obj2.a=3 obj2.b=1 console.log(o.get('getThis'));
//{ a: 3, b: 1 }