JavaScript 克隆一个“类”实例
JavaScript cloning a "class" instance
我有一个这样的类:
function Element(){
this.changes = {};
}
现在我有一个像这样的"类"实例,el = new Element()
.这些实例存储在数组中,如 elements.push(el)
.
这个元素数组现在存储在一个对象中,然后将其推送到一个数组中,states
.
现在在某些情况下,我需要其中一个元素的副本,所以我需要做一些类似的事情,var cloned = $.extend(true, {}, states[0])
.在这里,我假设我们正在克隆第一个状态。
现在的问题是,我得到的,state[1].elements[0]
仍然指向原始实例。因此,我对克隆对象所做的任何更改也会更改原始对象。
被困在这样一个微不足道的问题上是令人沮丧的......
这是我为测试它而创建的小提琴:http://jsfiddle.net/E6wLW/
$.extend
只是克隆普通对象。如果对象具有构造函数,则不会克隆它,而只是复制。
来自$.extend
来源:
if ( jQuery.isPlainObject(copy) /* ... */) {
// do the recursive $.extend call and clone the object
} else if ( copy !== undefined ) {
target[ name ] = copy;
// ^^^^^ just copy
}
因此,$.extend()
将调用返回 false 的isPlainObject(el)
,因为它el
有一个构造函数,而不是克隆el
被复制。所以states[1].elements[0]
与states[0].elements[0]
是同一个对象,因为它不是克隆的。
如果我们从以下位置修改您的示例:
function Element(){
this.changes = {};
}
var el = new Element(); // $.isPlainObject(el); <- false
// ...
到:
var el = { changes: {} }; // $.isPlainObject(el); <- true
// ...
它将正确克隆el
。在这里看到它。
您可以使用
http://documentcloud.github.com/underscore/#clone 来克隆对象,例如:
var cloned = _.clone(states[0]);
相关文章:
- 同一项怎么可能在一个实例中未定义,却在另一个实例上定义
- jQuery"焦点”;在一个实例中有效,但在其他实例中无效
- 当与另一个实例进行比较时,我的类实例如何隐式返回数字
- 为什么可以't我使用成员方法初始化一个实例
- 如何使用 JavaScript 正则表达式搜索除一个实例之外的所有内容
- 挖空视图模型函数仅影响最后一个实例
- 插件总是只得到最后一个实例,如何让它适用于多个元素
- arguments变量是的一个实例
- 使用javascript删除特定HTML实体(breadcrumb)的最后一个实例
- jquery获取类的下一个实例的值
- 如何使外部按钮只影响类的一个实例
- javascript中的Ruby插值在两个实例中的一个实例中不起作用
- 剑道网格:在Angular指令中获取一个实例
- 多个 xmlhttp 请求会导致除最后一个实例之外的所有实例的 readystate 都达不到 4
- Wordpress jQuery 脚本不会在具有 jQuery.noConflict 用法的一个实例上启动
- 如何将 url (http://example.com) 的一个实例限制为仅在客户端打开一次
- 在单个页面上使用此.js 2 次时,它仅适用于一个实例
- 查找给定工作日的下一个实例(即.星期一)与时刻.js
- 谷歌地图将边界限制在世界的一个实例中
- CKEditor 一个实例用于多个 ID