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.innerText将foo
的参数重命名为event
后的code>,是访问单击文本的方式。@traktor这是一个打字错误,感谢您让我知道。selbie和trincot回答了我需要知道的一切,以便进行更多的搜索并找到我所面临的问题。是的,但是这个新的barClass()。function1
没有多大意义,因为他们甚至没有试图以任何方式保存或使用对象。看起来OP可能有静态方法,根本不需要对象。我真的认为你在开始猜测之前应该坚持一个更清楚的问题。这不是猜测。它回答了他们的问题。但是你是对的,他们可能误用了一个类来实现静态函数,或者一个模块等等。他们当然误用了术语“类”,因为它们的意思是“实例”(但这是一种常见的误用)。我正要对这一切发表评论,但你已经发表了评论,所以我投了我的票。您会注意到,我在回答中没有重复new barClass()。function 1
…trincot和@jfriend,感谢您指出误用的地方,我将进一步研究该主题