JavaScript 的 Array 调用和函数在 Prototype 中失败
JavaScript's Array call and functions fail inside 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')
我想用数组做什么并不重要,它只是不断给我访问错误,就好像它不存在在原型中一样。
我做错了什么?:(我只是像原型内的任何其他值一样访问数组)。对象内部的对象有问题吗?
问题是在事件处理程序内部this
不是你想的那样。您可以将事件处理程序函数与 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
});
}
好像它不存在在原型中。
不,确实如此。
我只是在访问数组
那是你没有的。 this
不会指向事件侦听器中的Keyboard
实例。
当函数作为事件侦听器调用时,DOM 元素将是上下文(jQuery 也这样做)。请参阅 MDN 的 this
关键字概述。您可以使用闭包范围的变量来保存对实际实例的引用,例如此处所述(对此有很多问题)。
可能的快速修复:
-
$('body').keydown( (function(){...}).bind(this))
-
var that=this; $('body').keydown(function(){ that.pressedKeys...; });
相关文章:
- 直接在函数声明上使用function.prototype.bind
- 如何迭代Array.prototype函数
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- Object.prototype using 'this'
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- jQuery.getJSON失败,语法错误
- ng disabled在放入多个表达式时失败
- Jasmine单元测试在监视服务方法时失败
- JavaScript 的 Array 调用和函数在 Prototype 中失败
- 扩展 JS Boolean.prototype 失败
- 当我加载prototype.js时,我的javascript失败了,如何修复它
- 对象.object.constructor.prototype失败