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

能否定义可持有并操作自身属性值的对象?对应示例代码如何正常运行?

问题原因

你代码报错的核心原因是使用了箭头函数作为对象方法,箭头函数没有独立的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:39:05