JavaScript中在Object.defineProperty内使用箭头函数时的this行为
JavaScript中在Object.defineProperty内使用箭头函数时的this行为
嘿,这个问题其实是箭头函数的核心特性导致的,我来给你捋明白~
首先得搞清楚箭头函数和普通函数在this绑定上的本质区别:
- 普通函数的
this是动态绑定的,它的值取决于函数的调用方式。比如作为对象的getter调用时,this会指向被访问的对象本身。 - 但箭头函数不一样,它没有自己独立的
this,它的this是词法绑定的——也就是直接继承自它定义时所在的外层作用域的this,完全不会跟着调用上下文变化。
回到你的代码里,你把getter写成了箭头函数:
get: () => { console.log(this.a, typeof this.a, this); return this.a + 10; }
这个箭头函数定义的时候,外层作用域是全局作用域(因为你的代码在全局环境执行),所以它的this就绑定到了全局对象(浏览器里是Window,Node.js里是global),完全不会跟着getter的调用对象obj走。这就是为什么你访问obj.b时,this.a是undefined,this指向全局对象。
那要实现你想要的效果(this指向obj),只需要把箭头函数换成普通函数就行:
"use strict"; const obj = { a: 10, }; Object.defineProperty(obj, "b", { get: function() { console.log(this.a, typeof this.a, this); return this.a + 10; }, });
现在再访问obj.b,你会发现this指向obj,this.a是10,返回值是20,完全符合你的预期啦~
备注:内容来源于stack exchange,提问作者Kübra Aksu
相关产品推荐
相关产品推荐

