的Object.create继承和初始化代码
我有下面的代码,它定义了输入事件管理类:鼠标,触摸,指针,...的Object.create继承和初始化代码
// base.js
export default() => {
return {
el: undefined,
event: undefined,
handler(ev) {
console.log('default handler')
},
attach() {
el.addEventListener(event, this.handler.bind(this), false)
},
detach() {
el.removeEventListener(event, this.handler.bind(this), false)
}
}
}
// mouse.js
import baseInput from './base'
export default (el) => {
return Object.assign(Object.create(baseInput()), {
el: undefined,
event: 'mousedown',
handler(ev) {
console.log('mouse handler)
}
}
}
有一些共同的商业逻辑在“基地”对象。
的问题来自于attach
和detach
函数调用,因为返回的约束功能是不是每次调用相同,因此removeEventListener
不能删除通过addEventListener
添加的事件监听器。
我知道我必须保持一个单一功能的参考。我的问题是代码应该在哪里。
一种解决方案可能是:
// base.js
export default() => {
let boundFunction;
return {
el: undefined,
event: undefined,
getBoundFunction() {
if (!boundFunction) {
boundFunction = this.handler.bind(this)
}
},
handler(ev) {
console.log('default handler')
},
attach() {
el.addEventListener(event, this.getBoundFunction(), false)
},
detach() {
el.removeEventListener(event, this.getBoundFunction(), false)
}
}
}
此代码的工作,但我不希望额外getBoundFunction
呼吁每个事件触发,我觉得应该有一个更好的方法或最佳实践。
通过改变handler
名称handleEvent
实现事件监听器接口。然后你直接绑定对象。
的this
在handleEvent
函数的值将是绑定的对象。
// base.js
export default() => {
return {
el: undefined,
event: undefined,
handleEvent(ev) {
console.log('default handler')
},
attach() {
el.addEventListener(event, this, false)
},
detach() {
el.removeEventListener(event, this, false)
}
}
}
所以后来从基础对象继承的对象可以定义自己的handleEvent
功能,当绑定的事件触发后调用。
另外,您似乎正在为每个从它继承的对象创建一个新的基础对象。为什么不共享基础对象?这是原型继承的一点。
这是一个很少使用的技巧。如果将对象传递给'addEventListener'和'removeEventListener',它会查找一个名为'handleEvent'的特殊属性名称,并用原始对象的上下文对其进行调用。奇怪的,但工程。 – jfriend00
@ jfriend00:你说得对。我认为人们不知道它。它在统一业务逻辑和事件处理对象方面做得很好。使组织良好的代码,国际海事组织。 – llama
FWIW [对象如何可以实现在JavaScript Event接口(https://*.com/questions/40353746/how-can-an-object-implements-the-event-interface-in-javascript/) – guest271314
这是因为你创建新的基础对象,其所有属性复制到一个新的对象做继承,然后把它的方式很奇怪,有点浪费的方式。你为什么这样做继承?您可以使用新的属性/方法扩展基础对象,而不是复制并丢弃它。 – jfriend00
在第一个代码块中必须存在拼写错误,因为在'mouse.js'中,有两个连续的'return'语句。 – jfriend00
是的。有一个错字。谢谢。固定! – manelio