的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) 
    } 
    } 
} 

有一些共同的商业逻辑在“基地”对象。

的问题来自于attachdetach函数调用,因为返回的约束功能是不是每次调用相同,因此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呼吁每个事件触发,我觉得应该有一个更好的方法或最佳实践。

+1

这是因为你创建新的基础对象,其所有属性复制到一个新的对象做继承,然后把它的方式很奇怪,有点浪费的方式。你为什么这样做继承?您可以使用新的属性/方法扩展基础对象,而不是复制并丢弃它。 – jfriend00

+0

在第一个代码块中必须存在拼写错误,因为在'mouse.js'中,有两个连续的'return'语句。 – jfriend00

+0

是的。有一个错字。谢谢。固定! – manelio

通过改变handler名称handleEvent实现事件监听器接口。然后你直接绑定对象。

thishandleEvent函数的值将是绑定的对象。

// 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功能,当绑定的事件触发后调用。


另外,您似乎正在为每个从它继承的对象创建一个新的基础对象。为什么不共享基础对象?这是原型继承的一点。

+2

这是一个很少使用的技巧。如果将对象传递给'addEventListener'和'removeEventListener',它会查找一个名为'handleEvent'的特殊属性名称,并用原始对象的上下文对其进行调用。奇怪的,但工程。 – jfriend00

+0

@ jfriend00:你说得对。我认为人们不知道它。它在统一业务逻辑和事件处理对象方面做得很好。使组织良好的代码,国际海事组织。 – llama

+0

FWIW [对象如何可以实现在JavaScript Event接口(https://*.com/questions/40353746/how-can-an-object-implements-the-event-interface-in-javascript/) – guest271314