javascript - 使用 Object.create() 时,如何使用其他对象键引用对象键

标签 javascript event-handling object-create

我正在尝试通过制作一个人为的计算器模块来学习Object.create。我尝试过 bind 我尝试过删除 this,但没有结果。

问题:

如何像使用类一样在元素的另一个属性中引用对象的属性。 或者我的示例不是一个很好的模式?如果是这样,我应该如何构建计算器对象以在创建时提供事件监听器?

Calculator.js

const Calculator = {
  inputArr: [],
  init: (selector)=> {
    const el = document.querySelector(selector);
    el.addEventListener('click', this.pushValue); // this wont work.
    return this;
  },
  pushValue: (e) => {
    let val = e.target.value;
    if(val){
      this.inputArr.push(val);
      console.log(e.target, this.inputArr); // this wouldn't work.
    }
  }
};

const adder = Object.create(Calculator).init('#calc');

HTML:

<div id="calc">
  <button class="btns" value="1">1</button>
  <button class="btns" value="2">2</button>
</div>

最佳答案

该代码中的问题是您使用了箭头函数,但关闭了错误的this。箭头函数在定义它们的地方关闭,而不是在调用它们时设置它。在你的例子中,它在全局范围内关闭了 this

如果您创建 initpushValue 普通函数,并通过对通过 Object.create 创建的对象的引用来调用它们,它们将得到使用正确的 this 调用:

const Calculator = {
  inputArr: [],
  init: function(selector) {                                 // ****
    const el = document.querySelector(selector);
    el.addEventListener('click', this.pushValue.bind(this)); // ****
    return this;
  },
  pushValue: function(e) {                                   // ****
    let val = e.target.value;
    if(val){
      this.inputArr.push(val);
      console.log(e.target, this.inputArr);
    }
  }
};

const adder = Object.create(Calculator).init('#calc');

您确实需要从事件监听器绑定(bind)pushValue的调用(否则,this将引用该元素)。或者,将其包裹在箭头中:

el.addEventListener('click', e => this.pushValue(e));

this.pushValue 上使用箭头包装器的工作示例:

const Calculator = {
  inputArr: [],
  init: function(selector) { // ****
    const el = document.querySelector(selector);
    el.addEventListener('click', e => this.pushValue(e)); // ****
    return this;
  },
  pushValue: function(e) { // ****
    let val = e.target.value;
    if (val) {
      this.inputArr.push(val);
      console.log(e.target, this.inputArr);
    }
  }
};

const adder = Object.create(Calculator).init('#calc');
<div id="calc">
  <button class="btns" value="1">1</button>
  <button class="btns" value="2">2</button>
</div>

关于javascript - 使用 Object.create() 时,如何使用其他对象键引用对象键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40832228/

相关文章:

javascript - 在 AngularJS 和 Node 作为后端发送 sendgrid 电子邮件时未调用 app.post 方法

javascript - 某些函数中的 JS/JQuery 全局数组错误

Javascript object.create 和 isPrototypeOf

javascript - 如何防止更改原型(prototype)?

javascript - 如何让 Angular 在 ajax get 之后更新集合

javascript - 如何通过 javascript 文件 api 读取大(>300 MB)图像或视频文件,将其存储在本地,检索并显示?

C# 事件处理器订阅管理

C# 事件 : How to process event in a parallel manner

c# - 手动连接 Page_PreInit 事件,AutoEventWireup 设置为 false

javascript - 原型(prototype)继承: Can you chain Object.创建?