如何在ES2015中克隆对象(包括其原型)

时间:2016-05-30 14:01:41

标签: javascript backbone.js underscore.js ecmascript-6

我正在清理一些旧的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创建对象的实际克隆?

1 个答案:

答案 0 :(得分:1)

要保留原型,您可以使用

const modelCopy = Object.assign(Object.create(Object.getPrototypeOf(this.model)), this.model)