能否定义可持有并操作自身属性值的对象?对应示例代码如何正常运行?
问题原因
你代码报错的核心原因是使用了箭头函数作为对象方法,箭头函数没有独立的this绑定,其this继承自定义时的外层作用域,既不会指向当前对象,也无法直接访问对象内部的jobs属性(你写的jobs是试图访问当前作用域下的变量,该变量不存在自然会报错)。
修复方案
方案1:替换为普通函数(最适合对象字面量写法)
把方法换成普通函数,通过this指向当前对象访问jobs属性,同时建议加判空逻辑避免队列空时调用报错:
const myThing = { jobs: [], addJob: function(id, job) { this.jobs.push({id: id, job: job}) }, runNext: function() { if (this.jobs.length > 0) { this.jobs.shift().job() } } }
注意:如果需要把方法单独抽离出来调用,需要提前用
bind绑定this指向myThing,避免this丢失。
方案2:用Class类实现(更适合可复用的实例场景)
如果后续需要创建多个同类型的实例,用类的写法更规范:
class MyThing { constructor() { this.jobs = [] } addJob(id, job) { this.jobs.push({id, job}) } runNext() { if (this.jobs.length) { this.jobs.shift().job() } } } // 创建实例使用 const myThing = new MyThing()
方案3:保留箭头函数的写法(不推荐,仅做参考)
如果一定要用箭头函数,可以直接引用对象名访问属性,因为箭头函数的外层作用域可以访问到定义的myThing变量:
const myThing = { jobs: [] } myThing.addJob = (id, job) => myThing.jobs.push({id, job}) myThing.runNext = () => { if (myThing.jobs.length) myThing.jobs.shift().job() }
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

