骨干模型及其原型链的深度副本

Deep copy of backbone model with its prototype chain

本文关键字:深度 副本 原型 模型      更新时间:2023-09-26

我需要深度复制骨干模型。 clone方法不进行深层复制,则对attributes对象的引用将复制到克隆中。我已经通过以下方式完成了此操作:

var model = Backbone.Model();
// modifying model
var clone = _.merge(Object.create(Object.getPrototypeOf(model)), model);

有没有更好的选择?

有没有更好的选择?

使用基准测试.js来比较此方法与本机方法的性能:

var bench1 = new Benchmark(
  {'fn':merge_object, 'cycles':0,'count':1,'name':'merge','async':true}
);
var bench2 = new Benchmark(
  {'fn':parse_object, 'cycles':0,'count':1,'name':'parse','async':true}
);
var foo = {"bar": {"baz": {"bop": "zero"} } };
function merge_object()
  {
  var clone = _.merge(Object.create(Object.getPrototypeOf(foo)), foo);
  }
function parse_object()
  {
  new Backbone.Model(JSON.parse(JSON.stringify(foo)))
  }
function log(result){console.log(JSON.parse(JSON.stringify(result)))};
bench1.on('complete', log);
bench2.on('complete', log);
bench1.run();
bench2.run();
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/2.1.2/benchmark.min.js"></script>

引用

  • 结构克隆通用JS模块

  • JS对象克隆

  • MDN: Array.from()