JavaScript 的数组调用和函数在 Prototype 中失败

标签 javascript prototype

我有这个代码:

function Keyboard() {

    this.log = $('#log')[0];
    this.pressedKeys = [];

    this.bindUpKeys = function() {
        $('body').keydown(function(evt) {
            this.pressedKeys.push(evt.keyCode);

            var li = this.pressedKeys[evt.keyCode];

            if (!li) {
                li = this.log.appendChild(document.createElement('li'));
                this.pressedKeys[evt.keyCode] = li;
            }

            $(li).text('Down: ' + evt.keyCode);
            $(li).removeClass('key-up');
        });
    }

    this.bindDownKeys = function() {
        $('body').keyup(function(evt) {
            this.pressedKeys.push(evt.keyCode);

            var li = this.pressedKeys[evt.keyCode];

            if (!li) {
                li = this.log.appendChild(document.createElement('li'));
            }

            $(li).text('Up: ' + evt.keyCode);
            $(li).addClass('key-up');
        });
    }

}

我收到这些错误:

TypeError: 'undefined' is not an object (evaluating 'this.pressedKeys.push')

我想对数组做什么并不重要,它只是不断地给我带来访问错误,就好像它不存在于原型(prototype)中一样。

我做错了什么? :( 我只是像原型(prototype)中的任何其他值一样访问数组)。对象内部的对象是否存在问题?

最佳答案

问题是在事件处理程序内部 this 并不是你想象的那样。您可以使用 bind 方法绑定(bind)事件处理函数(或者,因为看起来您正在使用 jQuery,$.proxy ):

this.bindUpKeys = function() {
    var that = this;
    $('body').keydown($.proxy(function(evt) {
        //Use `this` as normal inside here
    }, this));
}

或者您可以在事件处理程序之外存储对 this 的引用,例如

this.bindUpKeys = function() {
    var that = this;
    $('body').keydown(function(evt) {
        //Use `that` instead of `this` in here
    });
}

关于JavaScript 的数组调用和函数在 Prototype 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309789/

相关文章:

javascript - 页面加载时的 History.js getState()

javascript - 如何构建类似 jQuery 的事件?

javascript - 获取网站的主要颜色

JavaScript Object.create 现有对象的样式

javascript - 就良好实践而言,带有闭包的 javascript 原型(prototype)是一件好事吗

javascript - 高级原型(prototype)函数

javascript - 生成字符串的所有辅音

javascript - 在 Angular 2 中从 ngFor 生成子组件

javascript - 将方法继承到除基元之外的所有对象

javascript - JavaScript 函数原型(prototype)属性中的 __proto__