首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jQuery的(深度)扩展bug?

jQuery的(深度)扩展bug?
EN

Stack Overflow用户
提问于 2015-02-12 08:34:12
回答 2查看 288关注 0票数 0

我试图使用jQuery深入复制一个对象,但它无法提供一个完全独立的对象。

这是我的密码。

代码语言:javascript
运行
复制
var copy = $.extend(true, {}, this);

然后,当我比较这两个对象时,我得到了以下结果:

  • copy == this => false (目前为止还不错)
  • copy.LstOptions == this.LstOptions => false (目前为止还不错)
  • copy.LstOptions[0] == this.LstOptions[0] => true (problem)

LstOptions不是一个原始类型,它实际上是一个对象数组。它的内容如下:

代码语言:javascript
运行
复制
[{"ID":22,"Name":"man"},{"ID":27,"Name":"weird"},{"ID":25,"Name":"womanii"}]

为什么它没有被深拷贝,以及如何让它被深复制?

Ps:这是我的全部废话:

代码语言:javascript
运行
复制
{"changed":false,"data":null,"LstOptions":[{"ID":22,"Name":"man"},{"ID":27,"Name":"weird"},{"ID":25,"Name":"womanii"}],"NewRecord":null,"NewID":0,"done":false}

this还有一些方法(构造函数),没有属性(get/setter)。

这是一个JSFiddle https://jsfiddle.net/wk9e2kgn/1/,console.log输出true,我希望它能输出false

EN

回答 2

Stack Overflow用户

发布于 2015-02-12 12:56:50

jQuery不深入复制对象的成员,这些成员的类型是自定义对象。

最好的工作可能是创建一个副本构造函数。

编辑:我刚刚在构造函数的末尾添加了this.constructor = Object.prototype.constructor;,这使得jQuery的扩展深度复制了对象。

代码语言:javascript
运行
复制
SpecialDataField.Options.Option = function (ref) {
    /**
    @type {int}
    */
    this.ID = 0;

    /**
    @type {?string}
    */
    this.Name = null;

    if (ref != null) {
        for (var v in this) {
            if (v in ref) {
                this[v] = ref[v];
            }
        }
    }

    this.constructor = Object.prototype.constructor;
}
票数 0
EN

Stack Overflow用户

发布于 2015-02-12 09:32:31

在您的示例中,jQuery运行得非常好。我创建了一个jsfiddle,向您展示jquery正在使用$.extend对您的对象进行深度复制。我还通过更改值原始对象的属性来测试它,但它不影响复制对象的相同属性。

我为此编写的代码如下:

代码语言:javascript
运行
复制
var original= {"changed":false,"data":null,"LstOptions":[{"ID":22,"Name":"man"},{"ID":27,"Name":"weird"},{"ID":25,"Name":"womanii"}],"NewRecord":null,"NewID":0,"done":false};

// deep copy
var copy = $.extend(true, {}, original);

// compare objects which results false
alert(original.LstOptions[0]==copy.LstOptions[0]);

// change value
original.LstOptions[0].Name="Ankush";

// check same property of both objects
alert(original.LstOptions[0].Name);
alert(copy.LstOptions[0].Name);

你可以在这里找到小提琴

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28472727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档