Javascript ';这';不';赋值和绑定到变量时不起作用
我正在尝试创建一个自定义模块。我正在使用Javascript ';这';不';赋值和绑定到变量时不起作用,javascript,Javascript,我正在尝试创建一个自定义模块。我正在使用prototype添加其他方法。模块将有一个事件,在该事件中,我必须使用“this”从模块访问一个方法。我将使用bind执行此操作 我遇到了一个小问题。我创建了一个方法,然后使用prototype,用bind方法将该方法分配给变量。问题是,“this”不是我通过的bind。以下是示例代码: 函数MyPlugin(){ this.hello='hello' document.addEventListener('click',this.clickedBin
prototype
添加其他方法。模块将有一个事件,在该事件中,我必须使用“this
”从模块访问一个方法。我将使用bind
执行此操作
我遇到了一个小问题。我创建了一个方法,然后使用prototype
,用bind
方法将该方法分配给变量。问题是,“this
”不是我通过的bind
。以下是示例代码:
函数MyPlugin(){
this.hello='hello'
document.addEventListener('click',this.clickedBinded);
这个。点击绑定('e');
}
MyPlugin.prototype.clickedBinded=clicked.bind(这个);
函数(e){
log(this.hello,e);
}
var plugin1=新的MyPlugin()
.bind()
必须在您希望将其绑定到的对象已经创建之后,以及在正确的上下文中对所需对象进行引用时调用。首次加载代码时,您正在调用.bind()
。对于此
,该值没有意义。相反,请将代码更改为:
函数MyPlugin(){
this.hello='hello';
//保存绑定函数,以便以后可以使用它删除侦听器
this.fn=this.clicked.bind(this);
document.addEventListener('click',this.fn);
点击('e');
}
MyPlugin.prototype.clicked=函数(e){
log(this.hello,e);
}
//方法,该方法将删除事件侦听器
MyPlugin.prototype.stopClick=函数(){
document.removeEventListener('click',this.fn);
}
var plugin1=新的MyPlugin()代码>正如jfriend00所解释的,应该在构造函数内绑定事件侦听器。每个实例将有一个不同的侦听器
如果希望能够删除侦听器,请将其存储在实例中:
var click=document.getElementById('click'),
remove=document.getElementById('remove');
函数MyPlugin(){
this.hello='hello';
var listener=clicked.bind(这个);
click.addEventListener('click',listener);
remove.addEventListener('click',function self()){
click.removeEventListener('click',listener);
remove.removeEventListener('click',self');
});
}
单击的函数(事件){
log(this.hello);
}
var plugin1=新的MyPlugin()代码>
实际上,这正是您传递给bind
的内容。。。看看代码,当执行那行代码时,你认为这是什么?它将是窗口
或空
,但决不会是一个甚至没有被实例化的对象,因为您的代码的行为符合预期。看来你完全误解了这一点。很可能,您只需要MyPlugin.prototype.clickedBinded=clicked
@Oriol这是我的想法,但是调用addEventListener
@Barmar不起作用。好的,我只看到了clickedBinded
调用,而没有看到事件侦听器。然后我会像jfriend所说的那样绑定听众。@JaromandaX谢谢!这就解释了为什么它是窗口
。真不敢相信我没听懂!(刚刚了解了这个
,和绑定
)我更新了问题。你能把你的代码转换成一个堆栈片段让我们运行吗?@Jessica-没问题。您只需保存绑定引用,以便以后可以使用它删除事件处理程序。请参阅我问题中的更新代码。下次发布第一个问题时,请描述实际问题。谢谢!是否有一种方法可以执行this.fn=this.clicked.bind(this)
使用prototype
?@Jessica-我不知道你说的“使用prototype”是什么意思。有没有办法用MyPlugin.prototype来代替。
谢谢!有没有一种方法可以使用原型?