ネイティブ JavaScript イベント オブジェクトのディープ コピー/クローン作成の方法を知っている人はいますか? 新しいイベント オブジェクトを作成し、元のイベントに一致するように適切なプロパティを手動で設定できることはわかっていますが、単に複製する方法があれば、はるかに簡単になります。
14010 次
4 に答える
12
上記のコードは、ゲッター/セッターを適切にコピーしません。試す:
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;
}
于 2016-09-23T21:28:20.167 に答える
11
あなたの目的のために、私はそれを新しいオブジェクトコンストラクターのプロトタイプにして、変更したいものをオーバーライドします。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
...*/
この場合、「複製された」オブジェクトは、新しいオブジェクトのプロトタイプ オブジェクトです。'これ。' プロパティはプロトタイプ オブジェクトの前にチェックされるため、これらはオーバーライドされます。または、オブジェクトの構築後にプロパティをアタッチすることもできます。
于 2012-09-24T22:29:12.183 に答える