Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从ES6中的类中获取变量?_Javascript_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript 如何从ES6中的类中获取变量?

Javascript 如何从ES6中的类中获取变量?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,嗨,我没有从KeyCodeClass中获取变量。以下是我尝试的: 测试1 class KeyCodeClass1 { constructor() { this.space; } KeyDown(e) { if (e.keyCode == 32) { this.space = true } } KeyUp(e) { if (e.keyCode == 32) { this.space = false }

嗨,我没有从KeyCodeClass中获取变量。以下是我尝试的: 测试1

class KeyCodeClass1 {
    constructor() {
        this.space;
    }
    KeyDown(e) {
        if (e.keyCode == 32) { this.space = true }
    }
    KeyUp(e) {
        if (e.keyCode == 32) { this.space = false }
    }
}

var KeyCode1 = new KeyCodeClass1();
window.addEventListener("keydown", KeyCode1.KeyDown, false);
window.addEventListener("keyup", KeyCode1.KeyUp, false);

setInterval(loop1,10);

function loop1() {
     console.log(KeyCode1.space);
}
现在我在控制台中没有定义。因此,如果我按空格键what等于
e.keyCode==32
将打印未定义的停留。那么,如果我们在函数中返回值,我们会得到:test2

class KeyCodeClass2 {
    constructor() {
        this.space;
    }
    KeyDown(e) {
        if (e.keyCode == 32) { this.space = true }
    }
    KeyUp(e) {
        if (e.keyCode == 32) { this.space = false }
    }
    Space() {
        return this.space;
    }
}

var KeyCode2 = new KeyCodeClass2();
window.addEventListener("keydown", KeyCode2.KeyDown, false);
window.addEventListener("keyup", KeyCode2.KeyUp, false);

setInterval(loop2,10);

function loop2() {
     console.log(KeyCode2.Space());
}
因此,控制台中仍有一个未定义的。我使用构造函数中的
true
false
定义
this.space
的3个测试:测试3

constructor() {
    this.space = false;
}
我们在控制台中得到
false
。但是当我按下空格键时,它不会变成
true

所以我开始怀疑课堂上的函数是否有效。这里证明它们工作良好:测试4

class KeyCodeClass4 {
    constructor() {
        this.space = false;
    }
    KeyDown(e) {
        if (e.keyCode == 32) {
            KeyCodeClass.space = true;
            console.log("space Down");
        }
    }
    KeyUp(e) {
        if (e.keyCode == 32) {
            KeyCodeClass.space = false;
            console.log("space Up");
        }
    }
}

var KeyCode4 = new KeyCodeClass4();
window.addEventListener("keydown", KeyCode4.KeyDown, false);
window.addEventListener("keyup", KeyCode4.KeyUp, false);

我为什么要这样做?这是为了使我的代码更加可读和易懂。请帮我解决这个问题。

在我看来,您正在丢失
这个
上下文,因此,当您的侦听器被执行时,
这个
不是指向您的类实例,而是指向
窗口
对象。我会尽量做到:

var KeyCode = new KeyCodeClass2();
window.addEventListener("keydown", KeyCode.KeyDown.bind(KeyCode), false);
window.addEventListener("keyup", KeyCode.KeyUp.bind(KeyCode), false);

让我知道这是否适用于您

(与主要问题无关)。请注意
this.space是不可操作的。它在
上查找
空格的值,然后丢弃该值。它没有“声明”
space
为实例属性或任何类似的属性。@t.J.Crowder-thx对于反馈,我仍然是一名学生,我的老师不擅长JavaScript,并且在寻找错误的解决方案。(关于副本)。我被这个问题困扰了大约4个星期