我正在尝试通过制作一个人为的计算器模块来学习对象。我尝试过bind
尝试删除this
,但没有结果。
问题:
您如何在类似于类别的元素属性中引用对象的属性。或我的示例不是一个很好的模式?如果是这样,我应该如何构建我的计算器对象,以负担creation
上的事件听众?
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
上关闭,而不是将其调用时设置。在您的情况下,它将在全球范围上关闭this
。
如果您制作init
和pushValue
正常功能,并通过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');
您确实需要从事件侦听器中调用pushValue
的bind
(否则,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>