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
相关产品推荐
相关产品推荐

