如何正确访问与修改嵌套对象中外层属性值
解决嵌套对象中的 this 指向问题:从根源到实践
在日常的 JavaScript 面向对象编程中,你是否也曾遇到这样的困惑:一个内嵌在实例内部的对象,它的方法本应操作外层实例的属性,却始终无法生效?
先别急着怀疑代码逻辑,这通常是 this 指向问题导致的。举个例子:你创建了一个 part 构造函数,内部嵌套了一个 exampleObj,该对象含有一个 action 方法,目的是递增 part 实例的 x 属性。但当你直接调用 exampleObj.action() 时,this 却指向了 exampleObj 自身——它根本没有 x 属性。于是,要么静默失败,要么抛出错误。
实际上,这个问题的根源在于 JavaScript 的一条基本规则:函数的 this 指向由调用方式决定,而非其定义位置。当执行 exampleObj.action() 时,this 自然指向 exampleObj;而我们需要它指向 part 实例(比如 p)。解决方案很直接——显式告诉函数:“执行时你的 this 应该是这个对象。”
最推荐的做法是使用 call() 在调用时动态指定 this:
var doThing = function() {
this.x++; // 这里的 this 会指向 part 实例
};
var exampleObj = {
action: doThing
};
function part(x, y, obj) {
this.x = x;
this.y = y;
this.exampleObj = obj;
this.function = function() {
this.exampleObj.action.call(this); // 关键:把当前 part 实例作为 this 传进去
};
}
const p = new part(1, 2, exampleObj);
p.function();
console.log(p.x, p.y); // 输出:2 2 ✅
有几点值得注意:
- 千万别直接调用
this.exampleObj.action()——这样this会指向exampleObj,导致失败。 - 如果你希望
action方法在执行时就锁定某个this,可以在构造函数中用bind()提前绑定:this.exampleObj.action = doThing.bind(this)。但注意,这样会给每个实例创建一个新函数,如果实例数量较多,可能会影响性能。 - 箭头函数无法解决此问题——它不绑定
this,而我们恰恰需要动态绑定运行时的实例,箭头函数的固定上下文显然不适用。 - 如果
exampleObj是多个part实例共享的对象(比如某些配置项或工具集),绝对不要在构造时用bind()将其绑定到某个具体实例。否则,其他实例调用时,this仍指向最初绑定的实例,数据会串乱,引发状态污染。

总结:当内层对象的方法需要修改外层实例的状态时,不要依赖隐式的
this绑定。坚持通过call(this)、apply(this, [...])或bind(this)将执行上下文控制在自己手中。这正是 JavaScriptthis机制的核心实践,也是确保嵌套对象与外部状态保持清晰归属关系的关键所在。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
HTML文档版权声明结构与基础脚手架代码质量解析
版权声明需用语义化``标签,©符号使用`©`实体;年份通过服务端、构建或JS分层兜底;`rel= "license "`仅指向真实许可证文件才有效。
基于HTML模板的组件化全栈交互方案
纯HTML模板仅作静态结构,全栈交互需后端注入数据、前端JS激活模板及用户事件触发双向链路。``标签惰性,不执行脚本或加载资源,需通过克隆填充数据并手动绑定事件实现交互,父子传值依赖JS对象与自定义事件。
Bootstrap修改Badge徽章边框为圆点样式的方法
将BootstrapBadge改为圆点:自定义类设置等宽高、border-radius:50%、padding:0、font-size:0;Bootstrap5 2+需加display:inline-block;注意垂直对齐,避免min-width干扰,背景色用background-color更可控。
Bootstrap响应式多栏Footer社交图标排版实现
使用Bootstrap5的grid系统实现响应式多栏Footer,按断点设置列宽;以FontAwesome处理社交图标,避免使用img;利用list-unstyled组织链接列表;借助flex-column容器配合mt-auto使版权行自动贴底,避免fixed-bottom固定定位的弊端。
如何用Shadow DOM隔离组件内外事件分发
ShadowDOM内部事件默认不穿透影子边界,需显式设置composed:true才能被外部监听。此时event target指向宿主元素,真实触发源需通过event composedPath()[0]获取。原生事件手动派发时也必须声明composed:true。应避免在宿主上依赖event target做逻辑分支,建议在shadowroot内绑定事件或使用
- 日榜
- 周榜
- 月榜
相关攻略
2026-07-07 07:02
2026-07-07 07:02
2026-07-07 07:02
2026-07-07 07:02
2026-07-07 07:02
2026-07-07 07:02
2026-07-07 07:01
2026-07-07 07:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

