混合jQuery,原型和“this”
Mixing jQuery, prototype and 'this'
我正在做一个使用JS原型和jQuery的项目。
我相信,我的问题是如何使用"这个"。
在我的代码中,我将在一个函数中有一些jQuery,我将对其进行原型设计。jQuery看起来像这样:(在此代码中,"target"是首次创建IMAGE_UPLOADER时传递的jQuery对象。
document.getElementById(target.find('.file_selector').prop('id')).addEventListener("change", this.FileSelectHandler, false);
在此事件侦听器中,有一个名为 FileSelectHandler 的函数。这个函数被调用得很好。但是,在此函数中,存在对第二个函数的调用。以下是该函数的简短版本:
FILE_UPLOADER.prototype.FileSelectHandler = function(e) {
this.FileDragHover(e);
}
这就是出现错误的地方。JS抱怨函数"FileDragHover"不存在。当然,它确实存在,并定义如下:
FILE_UPLOADER.prototype.FileDragHover = function(e) {}
我希望这些信息足以理解问题。如果没有,请告诉我,我可以添加更多。
$.proxy(( 将自定义执行处理程序传递给事件处理程序,this
事件处理程序内部引用了连接侦听器的 dom 元素 - 它与 Function.bind(( 相同,但 jQuery 版本支持 IE <9。
document.getElementById(target.find('.file_selector').prop('id')).addEventListener("change", $.proxy(this.FileSelectHandler, this), false);
处理程序注册可以使用 jQuery 简化为
target.find('.file_selector').change($.proxy(this.FileSelectHandler, this))
如果一个对象obj
有一个函数func
并且你这样做obj.func()
该函数是在obj
的上下文中调用该函数的,其中该函数中的this
然后引用obj
。
但是,如果您执行以下操作:
var callback = obj.func;
callback();
然后,callback
不再在obj
的上下文中调用。对于浏览器,上下文window
。如果您将函数作为回调传递给addEventListener
,就会发生这种情况。根据回调的使用方式,可以使用另一个上下文调用它,对于事件侦听器,它是 DOM 元素,因此代码中的this
引用 DOM 元素。
要解决此问题,您可以使用Function.prototype.bind
(您需要检查浏览器支持是否适合您或使用 polyfill,可以在 mdn 页面上找到(,您可以使用jQuery.proxy
或创建闭包并自己维护上下文。
this
变量引用调用对象,而不是声明方法的对象。因此,如果我有someObject.someFunction();
那么someObject是调用对象和函数中this
的值。
要演示:
var obj1 = {
name:"obj1",
say:function(){
console.log(this.name);
}
};
var obj2 = {name:"obj2"};
obj2.say = obj1.say;
obj2.say()//logs obj2
在上面的代码中,say 是在 obj1 上声明的,但从 obj2 调用。
有关此值、构造函数和原型的更多信息,请参见此处。
- 混合jQuery,原型和“this”
- Javascript,从原型函数自己的字段中获取“this”
- “this”在不是类原型的函数中
- 在原型中声明 TypeScript 成员,而不是添加到“this”中
- 从原型中的事件访问“this”
- 通过引用调用原型函数时,类会丢失“this”作用域
- 原型方法中的“this”在继承时未按预期解析
- Javascript原型和访问“this”的父对象
- 使用从 async.series 调用的原型函数中的“this”
- 我可以用javascript提供我/the/self=this的原型定义吗
- 传递一个原型's函数作为参数而不丢失'this'上下文
- 什么是原型,$.扩展,并返回this"不得不这么做
- this.collection.reset引发错误-未捕获类型错误:无法读取属性'原型'的未定义
- JavaScript数组.原型如何设置'this'到由方法获得的新数组
- 引用“this"在对象原型方法中的setInterval/setTimeout
- 如何访问我的实例'this'从揭示原型
- Javascript传递"this"从原型到另一个函数
- 什么是'this'当它在原型中时引用
- 设置“this"到实例,在创建原型函数期间的回调集中
- “this"原型内部是未定义的