Javascript对原型的新影响
我正在尝试将javascript对象绑定到事件侦听器,我将这样做: (这是一个简化的示例,但它使用了我感兴趣的模式) 因此,在运行自调用匿名函数后,每次触发Javascript对原型的新影响,javascript,Javascript,我正在尝试将javascript对象绑定到事件侦听器,我将这样做: (这是一个简化的示例,但它使用了我感兴趣的模式) 因此,在运行自调用匿名函数后,每次触发custom_事件时,都会调用my foo对象的bar方法 问题: 当从我的foo对象的事件处理程序中调用newfoo(x)时,是否会导致事件侦听器的重复 我的理解是,属于对象的prototype方法只创建一次,在我的例子中,调用newfoo()只会影响this.x。如果我是正确的,我很困惑为什么必须在foo的events方法中的事件侦听器中
custom_事件
时,都会调用my foo对象的bar方法
问题:
当从我的foo对象的事件处理程序中调用newfoo(x)
时,是否会导致事件侦听器的重复
我的理解是,属于对象的prototype
方法只创建一次,在我的例子中,调用newfoo()
只会影响this.x
。如果我是正确的,我很困惑为什么必须在foo
的events
方法中的事件侦听器中使用new
,以便使用附加到foo
的原型方法
我遗漏了什么?您似乎主要对新的
操作符的用法和效果感到困惑。我引述:
当函数前面有new
调用时,或者称为构造函数调用,会自动执行以下操作:
一个全新的物体是由稀薄的空气创造出来的
新构造的对象是链接的
新构造的对象被设置为该函数调用的this
绑定
除非函数返回自己的备用对象,否则调用的新
函数调用将自动返回新构造的对象
确保你能很好地理解这一点。关于你的问题:
当从我的foo对象的事件处理程序中调用newfoo(x)
时,是否会导致事件侦听器的重复
不可以。您使用new foo(x)
所做的是将foo
函数用作构造函数,因此您只需创建一个新的、原型链接的对象(类似于{}
),然后在foo
中执行代码,新对象为this
。因此,这将导致一个几乎为空的对象,除了它的属性x
。您只需在events
函数中设置事件侦听器
我的理解是,属于对象的prototype
方法只创建一次,在我的例子中,调用newfoo()
只会影响this.x
。如果我是正确的,我很困惑为什么必须在foo
的events
方法中的事件侦听器中使用new
,以便使用附加到foo
的原型方法
它们只在您称为“原型”的对象上定义过一次(这实际上只是函数foo
上的prototype
属性),是的。这里不需要使用new
,您所做的就是在已经存在的foo
对象的函数中创建一个一次性foo
对象
在调用bar()
之前,您可能不需要担心在构造函数中设置this.x
,而是在事件处理程序中:
这里您将遇到的问题是,事件处理程序上下文中的this
很可能由jQuery设置/覆盖,而不是指向要指向的“foo
对象”。要避免此问题,您需要在设置事件处理程序(即events
函数)时从词汇上捕获this
:
或者bind
将回调处理程序中的this
绑定到要引用的“foo
对象”:
events: function(){
$(document).on('custom_event', (function(event, x){
this.x = x;
this.bar();
}).bind(this));
}
请参阅MDN上的部分,以了解其作用
进一步注意:我不确定自定义事件到底是什么,但您正在监听每个事件处理程序中的整个$(文档)
。如果您有对应于每个foo
对象的DOM元素,则应该在这些特定DOM元素上设置这些事件处理程序。FYI:可能只是复制和粘贴错误,但您的事件缺少}
。只有在调用.events()
时,才会绑定您的自定义\u事件。由于该事件已绑定到文档
,因此每次调用.events()?您不需要执行varg=newfoo(x)代码>。这取决于你想做什么。您无法访问其中的this
,因此您可能需要执行var that=this$(document).on(“…”,function(){that.bar();})代码>这一切都取决于你试图做什么。@Rocket Hazmat-Inevents
如果我使用foo(x).bar()
而不是new foo(x).bar()
我得到无法读取未定义的属性“bar”。嗯,是的newfoo(x)
创建一个新的foo
对象(从而继承prototype
)foo(x)
只调用函数,对于构造函数来说,函数不会执行您想要的操作。
something.on('custom_event', function(e, x) {
this.x = x;
this.bar();
});
events: function(){
var self = this;
$(document).on('custom_event', function(event, x){
self.x = x;
self.bar();
});
}
events: function(){
$(document).on('custom_event', (function(event, x){
this.x = x;
this.bar();
}).bind(this));
}