You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:45:42