JavaScript OOP代码执行结果不符,疑与this关键字更新有关
问题原因及解决方法
你的问题和JavaScript版本更新无关,核心是箭头函数的this绑定规则和普通函数完全不同:
- 对象中的箭头函数不会将
this绑定到当前对象,而是捕获外层词法作用域的this(浏览器环境下是window,Node环境下是globalThis)。全局作用域中不存在hasDiscount属性,所以this.hasDiscount结果为undefined,转成布尔值是false,导致两次输出都是"You Don't Have Discount"。 - 讲师的代码实际用的是普通函数而非箭头函数,普通函数作为对象方法调用时,
this会指向调用它的对象。
修正后的代码:
let obj = { hasDiscount: true, // 改用普通函数写法 showMsg: function() { return `You${this.hasDiscount ? '' : " Don't"} Have Discount` } // 也可以用ES6方法简写: // showMsg() { // return `You${this.hasDiscount ? '' : " Don't"} Have Discount` // } } console.log(obj.showMsg()) // 输出:You Have Discount let newOne = Object.create(obj); newOne.hasDiscount = false; console.log(newOne.showMsg()) // 输出:You Don't Have Discount
修改后,调用obj.showMsg()时this指向obj,调用newOne.showMsg()时this指向newOne,就能得到预期结果。
内容的提问来源于stack exchange,提问作者Yassen Mohamed
相关产品推荐
相关产品推荐

