gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:15:20 25 4
gpt4 key购买 nike

我正在尝试通过制作一个人为的计算器模块来学习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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com