将事件对象传递给事件回调中的setter方法

时间:2018-01-09 17:47:24

标签: javascript createjs es6-class

我正在使用createjs库。

我有以下课程:

class Person {
 constructor(){
  this.name = 'John';
 }

 set updateName(event){
  this.name += event.key;
 }
}

接下来,我实例化这样的对象:

var human = new Person();

我正试图在每次按键时更新此人的姓名:

window.addEventListener.on('keydown', human.updateName);

然而,我收到错误的"无法读取属性' handleEvent'未定义"。

1 个答案:

答案 0 :(得分:2)

human.updateName尝试阅读updateName属性。由于您尚未为其定义吸气剂,因此结果为undefined。显然,无论你将它传递给(window.addEventListener.on),都希望传递给undefined以外的东西。

要传递实际的setter函数有点棘手,你必须通过getOwnPropertyDescriptor访问它然后传入它:

window.addEventListener.on('keydown', Object.getOwnPropertyDescriptor(human, "updateName").set);

为了确保正确的人员得到更新,您可能还需要bind

window.addEventListener.on('keydown', Object.getOwnPropertyDescriptor(human, "updateName").set.bind(human));

或者,使用箭头功能作为胶水会更简单:

window.addEventListener.on('keydown', e => {
    human.updateName = e;
});

旁注:updateName是您提供方法的名称,而不是属性。通常,只会调用name属性。

也许您打算将它作为一种方法?如果是这样的话:

class Person {
 constructor(){
  this.name = 'John';
 }

 updateName(event){ // No `set` on this line
  this.name += event.key;
 }
}

...和

window.addEventListener.on('keydown', human.updateName.bind(human));

window.addEventListener.on('keydown', e => {
    human.updateName(e);
});