Javascript-如何使用;这";ES6课程内

Javascript-如何使用;这";ES6课程内,javascript,ecmascript-6,Javascript,Ecmascript 6,如果我有以下方法: element.addEventListener('click', foo) const fooList = { 1: new barClass().function1, 2: new barClass().function2, 3: new barClass().function3, .... } const foo = (bar) => { foobar = bar.innerText; let hasFunctionInList = fooList

如果我有以下方法:

element.addEventListener('click', foo)

const fooList = {
 1: new barClass().function1,
 2: new barClass().function2,
 3: new barClass().function3,
 ....
}

const foo = (bar) => {
 foobar = bar.innerText;
 let hasFunctionInList = fooList[foobar ];
 if (hasFunctionInList) fooList[foobar ]()
}
当我在课堂上时,我可以做什么不同的事情来将课堂称为这样

class barClass {
 function1 () {}
 function2 () {
 ** this.function1() ** // in this case "this" doesn't stands for the class barClass, and gives me an error "this.function1 is not a function"
}
 function3 () {}
}

有几种方法。一种是创建显式绑定到正确的
this
的函数引用:

const instance = new barClass();
const fooList = {
 1: () => instance.function1(),
 2: () => instance.function2(),
 3: () => instance.function3(),
 ....
}
另一种解决方案是在调用时显式指定

const instance = new barClass();

// ...
let func = fooList[foobar];
if (func) func.call(instance);
请注意,事件处理程序中有一个错误。事件处理程序不获取作为参数的元素,而是获取事件对象。引用
以引用元素(但必须是
函数
),或获取参数的
目标
属性:

const foo = (e) => {
   foobar = e.target.innerText;
   // ...
}

正如在注释中提到的,在您的代码版本中,您创建实例,但不保留对这些实例的引用。此外,您的代码表明您希望每个函数作用于不同的实例。虽然你的问题没有揭示更大的图景是什么,但我们可以看到,根本没有明确的理由使用类。您可能应该只使用没有类的普通函数。

经典方法是使用绑定:

const fooList = {};

let bar = new barClass();
let func = barClass.function1;
fooList[1] = func.bind(bar);

bar = new barClass();
func = bar.function2;
fooList[2] = func.bind(bar);

或者在ES6中使用箭头语法:

const fooList = {};
let bar = new barClass();
fooList[1] = () => barClass.function1();

bar = new barClass();
fooList[2] = () => barClass.function2();

根本不清楚你到底想完成什么。看起来您在类上误用了类和方法。但是,为了进一步提供帮助,您需要备份几个步骤,并描述您试图解决的实际问题,因为这种方法看起来是错误的。而且,您不需要在类方法中“解决”
。当您使用
obj.method()
调用该方法时,您会将其传入。在构建
傻瓜
的过程中,您似乎在创建对象,然后扔掉它们,只是为了获得该方法。那样做没有意义。您需要对象,在这种情况下需要保存它,或者不需要对象,在这种情况下,您应该使用静态方法的普通函数。作为事件侦听器,
foo
被传递一个
event
对象作为其参数。可能
foobar=event.target.innerTextfoo
的参数重命名为
event
后的code>,是访问单击文本的方式。@traktor这是一个打字错误,感谢您让我知道。selbie和trincot回答了我需要知道的一切,以便进行更多的搜索并找到我所面临的问题。是的,但是这个
新的barClass()。function1
没有多大意义,因为他们甚至没有试图以任何方式保存或使用对象。看起来OP可能有静态方法,根本不需要对象。我真的认为你在开始猜测之前应该坚持一个更清楚的问题。这不是猜测。它回答了他们的问题。但是你是对的,他们可能误用了一个类来实现静态函数,或者一个模块等等。他们当然误用了术语“类”,因为它们的意思是“实例”(但这是一种常见的误用)。我正要对这一切发表评论,但你已经发表了评论,所以我投了我的票。您会注意到,我在回答中没有重复
new barClass()。function 1
…trincot和@jfriend,感谢您指出误用的地方,我将进一步研究该主题