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

如何通过鼠标点击事件调用JavaScript对象专属函数?

问题解决:绑定对象方法到DOM事件的this指向问题

你的核心问题是事件回调里的this指向不对:当把add_one直接作为点击监听函数时,函数里的this会指向触发点击的按钮元素,而不是你的item_for_tests对象,所以this.test_value根本不是你对象里的那个数值,自然无法递增。

下面给你几种简单的解决方式:

方法1:用bind()强制绑定this

bind()可以创建一个新函数,把函数内部的this固定为你传入的对象。修改set_add_btn里的监听绑定代码:

this.add_btn.addEventListener("click", elt.add_one.bind(elt), false);

完整修正后的代码:

<!DOCTYPE html>
<html>
<body>
  <div id="Score2" class="Resultat"> 0 </div>
  <button id="addbtn">+</button>

  <script>
    const item_manager = {
      test_value: 0,
      add_btn: null,

      set_add_btn: function(elt, id) {
        this.add_btn = document.getElementById(id);
        // 绑定this到elt对象
        this.add_btn.addEventListener("click", elt.add_one.bind(elt), false);
      },
      add_one: function() {
        this.test_value += 1;
        console.log(this.test_value);
        console.log(this); // 现在this指向item_for_tests
      }
    };
    const item_for_tests = Object.create(item_manager)
    item_for_tests.set_add_btn(item_for_tests, "addbtn");
  </script>
</body>
</html>

方法2:用箭头函数包裹回调

箭头函数不会创建自己的this,它会继承外层作用域的this,所以可以直接用箭头函数调用对象的方法:

this.add_btn.addEventListener("click", () => elt.add_one(), false);

方法3:保存对象引用到变量

在set_add_btn里把对象本身存到一个变量(比如self),然后在普通函数回调里用这个变量调用方法:

set_add_btn: function(id) {
  const self = this; // 保存当前对象的引用
  this.add_btn = document.getElementById(id);
  this.add_btn.addEventListener("click", function() {
    self.add_one(); // 用self调用方法,确保this指向对象
  }, false);
}
// 调用时不需要再传对象本身
item_for_tests.set_add_btn("addbtn");

为什么原来的代码不行?

当你直接把elt.add_one传给addEventListener,这个函数会被当作独立的回调执行,JavaScript默认会把事件触发的DOM元素(也就是按钮)设为函数内部的this,所以你在add_one里操作的this.test_value其实是按钮元素的属性,和你的对象没关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:42:56