克隆 javascript 事件对象

新手上路,请多包涵

有人知道如何对本机 javascript 事件对象进行深度复制/克隆吗?我知道我可以创建一个新的事件对象并手动设置适当的属性以匹配原始事件,但如果有一种方法只是克隆,它会容易得多。

原文由 paul smith 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 574
2 个回答

出于您的目的,我只是将其作为新对象构造函数的原型并覆盖您想要更改的那些。由于循环引用问题,JS 中的克隆变得混乱,因此它可能不是您希望的快速而肮脏的解决方案。

 function cloneEventObj(eventObj, overrideObj){

   if(!overrideObj){ overrideObj = {}; }

   function EventCloneFactory(overProps){
       for(var x in overProps){
           this[x] = overProps[x];
       }
    }

    EventCloneFactory.prototype = eventObj;

    return new EventCloneFactory(overrideObj);

}

//So add your override properties via an object
$el.click(function(e){
    var newEventObj = cloneEventObj(
        e,
        { target:document.body }
    );
    doSomething(newEventObj);
});

//or just stick 'em on manually after spitting the object out
/*...
var newEventObj = cloneEventObj(e);
newEventObj.target = document.body
...*/

在这种情况下,“克隆”对象是新对象的原型对象。 ‘这个。’在原型对象之前检查属性,因此这些属性将被覆盖。或者您可以在构建对象后附加属性。

原文由 Erik Reppen 发布,翻译遵循 CC BY-SA 3.0 许可协议

上面的代码不会正确复制任何 getter/setter。尝试:

 function cloneEvent(e) {
    if (e===undefined || e===null) return undefined;
    function ClonedEvent() {};
    let clone=new ClonedEvent();
    for (let p in e) {
        let d=Object.getOwnPropertyDescriptor(e, p);
        if (d && (d.get || d.set)) Object.defineProperty(clone, p, d); else clone[p] = e[p];
    }
    Object.setPrototypeOf(clone, e);
    return clone;
}

原文由 kofifus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题