我正在清理一些旧的Backbone.js应用程序,并将其大部分内容重写为ES2015。
我遇到了一个我们使用Underscore.js克隆模型的地方:
var startMove;
$(document).mousemove(function(e) {
var DIFF_SNAP = 10;
var DIFF_UNSNAP = 100;
var difLeft = $('#image').offset().left - e.pageX;
var difTop = $('#image').offset().top - e.pageY;
if (!startMove && Math.abs(difLeft) < DIFF_SNAP && Math.abs(difTop) < DIFF_SNAP) {
startMove = true;
$('html').removeClass('showCursor');
} else if (startMove && !(Math.abs(difLeft) < DIFF_UNSNAP && Math.abs(difTop) < DIFF_UNSNAP)) {
startMove = false;
}
if (startMove) {
$("#image").css({
left: e.pageX,
top: e.pageY
});
} else {
$('html').addClass('showCursor');
}
});
$(document).mouseleave(function() {
startMove = false;
})
$("#drop").mouseenter(function(){
if(startMove)
alert("Success");
});
直观地,我重写了它以使用var modelCopy = _.clone(this.model);
:
Object.assign
事实证明,const modelCopy = Object.assign({}, this.model);
并不像Object.assign
那样工作 - 它只给出了实际对象的属性和方法 - 而不是它的原型。
我知道Underscore是对Backbone的依赖,无论如何,但我仍然想知道:如何使用ES2015创建对象的实际克隆?
答案 0 :(得分:1)
要保留原型,您可以使用
const modelCopy = Object.assign(Object.create(Object.getPrototypeOf(this.model)), this.model)