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

JS类静态函数调用问题求助:Resource类静态方法调用无响应

解决Resource类静态方法调用与按钮点击的问题

嘿,我来帮你梳理下问题所在,以及怎么修复:

核心问题1:静态方法add()的定位错误

你把add设为静态方法,但它要修改的this.amount是实例属性——静态方法里的this指向的是Resource类本身,而不是具体的资源实例,类本身并没有amount这个属性,所以这个方法根本无法正确修改任何实例的数值,而且因为没有报错(只是默默失败),所以你看不到问题。

核心问题2:按钮点击事件绑定错误

你写的AddBtn.setAttribute("onClick", Resource.add())会在创建按钮的时候就立即执行Resource.add(),而不是等到点击按钮时才触发。就算能触发,也无法关联到对应的资源实例。


修复方案

1. 把add改为实例方法

既然add是要操作某个具体资源实例的状态,它应该是实例方法,和subtract一样:

class Resource {
 constructor(name, amount) {
 this.name = name;
 this.amount = amount
 this.image = "images/" + this.name + "Icon.png"
 }
 // 去掉static,改为实例方法
 add() {
 this.amount += 1
 console.log(`${this.name} 当前数量: ${this.amount}`) // 加个日志方便验证
 }
 subtract() {
 this.amount -= 1
 }
 trade() {
 console.log(this.name)
 }
}

2. 正确绑定按钮的点击事件

创建按钮时,需要让点击事件调用对应资源实例的add方法,这里可以用两种方式确保this指向正确的实例:

function createResourceCards() {
 let resources = createNewResourceClassInstance();
 console.log(resources);
 // 注意用let声明i,避免循环作用域问题
 for (let i = 0; i < resources.length; i++){
 const AddBtn = document.createElement("button")
 AddBtn.setAttribute("id", resources[i].name + "AddBtn")
 AddBtn.setAttribute("class", "btn btn-success add-btn")
 // 方式1:用bind绑定当前实例
 AddBtn.onclick = resources[i].add.bind(resources[i]);
 // 方式2:用箭头函数形成闭包,同样能绑定实例
 // AddBtn.onclick = () => resources[i].add();
 AddBtn.innerText = "+"
 // 别忘了把按钮添加到DOM中,比如添加到body或者指定容器
 document.body.appendChild(AddBtn);
 }
}

3. 简化createNewResourceClassInstance函数

这个函数里的for循环是多余的,map已经会遍历整个数组了,直接返回结果即可:

function createNewResourceClassInstance() {
 return ResourcesArray.map(res => new Resource(res, 0));
}

现在你再测试一下,点击每个"+"按钮,对应的资源实例的amount就会增加,控制台也能看到日志输出啦。

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:02:32