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

JavaScript类中为this定义的setter为何未触发及作用解析

为啥给类定义的this存取器没触发?

嘿,这个问题挺有意思的!咱们一步步来搞清楚:

首先,你执行var b = new Bind(123); b = 456;的时候没触发setter,原因很简单:你只是把变量b的指向从Bind实例改成了数值456,根本没碰原来那个实例的任何属性。这就好比你先把一个杯子放在桌子上叫它b,后来把杯子换成了苹果,杯子本身并没有被修改,自然不会触发杯子上的任何“事件”。

那你定义的set this(val)和get this()到底是干啥的?其实这里有个容易混淆的点:你并不是给JavaScript的this关键字本身添加存取器(这在JS里是做不到的),而是给类的实例定义了一个名为"this"的属性,并为这个属性设置了存取器。

因为this是JavaScript的关键字,所以你不能用点语法(b.this)来访问这个属性,必须用方括号语法:

var b = new Bind(123);
// 触发setter,会弹出alert
b['this'] = 789;
// 触发getter,返回123
console.log(b['this']);

换句话说,这个setter的实际作用就是:当你通过方括号语法给Bind实例的"this"属性赋值时,会执行你写的alert逻辑,而getter则会返回实例的val属性值。

本质上,这和你定义一个叫foo的属性存取器是一样的,只是属性名刚好是"this"这个关键字而已——JS允许用关键字作为属性名,但访问时必须用方括号。

内容的提问来源于stack exchange,提问作者Rafe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:58:10