对象的Boolean属性调用方法后不更新,原因何在?
问题原因
你代码里的核心问题在于:gen_s函数内部的let found是一个局部变量,当你在返回的对象中写found时,只是把这个局部变量的当前值(false)拷贝了一份作为对象的属性。后续change_found函数修改的是内部的局部变量found,和返回对象上的found属性是完全独立的两个值,所以外部访问对象的found属性自然不会看到变化。
解决方法
方法1:将found直接作为返回对象的属性
让内部方法直接操作对象自身的found属性,这样修改的就是同一个值:
const gen_s = function () { const obj = { found: false, change_found() { this.found = true; }, update() { this.change_found(); } }; return obj; }; // 原有调用逻辑不变 const s_arr = []; s_arr.push(gen_s()); console.log(s_arr[0].found); // 输出 false s_arr.forEach((s) => { s.update(); }); console.log(s_arr[0].found); // 输出 true
方法2:用闭包+getter保留变量私有性
如果想让found保持私有(外部只能读取,不能直接修改),可以通过getter来返回内部的局部变量值:
const gen_s = function () { let found = false; const change_found = function () { found = true; }; const update = function () { change_found(); }; return { change_found, update, // 定义getter,每次访问都会返回最新的内部found值 get found() { return found; } }; }; // 原有调用逻辑不变 const s_arr = []; s_arr.push(gen_s()); console.log(s_arr[0].found); // 输出 false s_arr.forEach((s) => { s.update(); }); console.log(s_arr[0].found); // 输出 true
方法3:内部方法直接引用返回对象
也可以在生成对象后,让内部方法直接引用这个对象的属性,避免this指向问题:
const gen_s = function () { const result = { found: false, change_found() { result.found = true; }, update() { result.change_found(); } }; return result; };
内容的提问来源于stack exchange,提问作者sspboyd
相关产品推荐
相关产品推荐

