GWT 应用程序中使用的 Javascript 通用 clone() 方法

2024-04-02

我试图编写一个通用克隆函数,它应该能够进行真正的深度克隆。我遇到过这个链接,如何在 javascript 中深度克隆 https://stackoverflow.com/questions/4459928/how-to-deep-clone-in-javascript并从那里获取该功能。

当我尝试直接使用 Javascript 时,该代码运行得很好。我对代码做了一些小修改,并尝试将 JS 代码放入 GWT 中。

克隆功能:

deepCopy = function(item)
{
    if (!item) {
        return item;
    } // null, undefined values check

    var types = [ Number, String, Boolean ], result;

    // normalizing primitives if someone did new String('aaa'), or new Number('444');
    types.forEach(function(type) {
        if (item instanceof type) {
            result = type(item);
        }
    });

    if (typeof result == "undefined") {
        alert(Object.prototype.toString.call(item));
        alert(item);
        alert(typeof item);
        if (Object.prototype.toString.call(item) === "[object GWTJavaObject]") {
            alert('1st');
            result = [];
            alert('2nd');
            item.forEach(function(child, index, array) {//exception thrown here
                alert('inside for each');
                result[index] = deepCopy(child);
            });
        } else if (typeof item == "GWTJavaObject") {
            alert('3rd');

            if (item.nodeType && typeof item.cloneNode == "function") {
                var result = item.cloneNode(true);
            } else if (!item.prototype) { 
                result = {};
                for ( var i in item) {
                    result[i] = deepCopy(item[i]);
                }
            } else {
                if (false && item.constructor) {
                    result = new item.constructor();
                } else {
                    result = item;
                }
            }
        } else {
            alert('4th');
            result = item;
        }
    }

    return result;
}

传递给该函数的列表如下所示:

List<Integer> list = new ArrayList<Integer>();
        list.add( new Integer( 100 ) );
        list.add( new Integer( 200 ) );
        list.add( new Integer( 300 ) );

        List<Integer> newList = ( List<Integer> ) new Attempt().clone( list );

        Integer temp = new Integer( 500 );
        list.add( temp );

        if ( newList.contains( temp ) )
            Window.alert( "fail" );
        else
            Window.alert( "success" );

但是当我执行这个时,我立即在克隆函数中得到空指针异常alert("2nd") line.

请帮忙。

P.S:我试图在这里获得一个可用于克隆任何对象的通用克隆方法。


GWT 原型对象没有 forEach 方法;它们不继承标准的 javascript 对象原型,因为它们的行为应该像 java 对象,而不是 javascript 对象。

您可能可以摆脱 Object.prototype.forEach.call(item, function(){})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GWT 应用程序中使用的 Javascript 通用 clone() 方法 的相关文章

随机推荐

  • 如何使从天蓝色广告收到的 Jwt 令牌无效

    我有 2 个应用程序 一个是 Spring Boot 另一个是 Angular 目前 我已将我的应用程序与 azure ad 集成 从而通过它进行身份验证 现在的问题是 当用户从前端应用程序注销时 如果令牌未过期 如何使Azure AD提供
  • 卡夫卡保留政策

    假设我有一个多代理 在同一主机上运行 Kafka 设置 其中包含 3 个代理和 50 个主题 每个主题配置为具有 7 个分区和 3 的复制因子 我有 50GB 内存可用于 kafka 并确保 Kafka 日志永远不会超过此内存量 因此我想配
  • 在子控制器中查看控制器框架大小

    我正在实施 UIViewcontroller 遏制 在下面的示例中 我在根控制器中设置了子控制器的帧大小 子视图显示为我设置的大小 但是当我检查它在 container1 内的边界时 它报告的大小与我设置的大小不同 根控制器 容器 void
  • MySQL 排序规则:utf8mb4_unicode_ci 与“utf8mb4 - 默认排序规则”

    请帮助我理解 MySQL Workbench 中列出的排序规则之间的差异 utf8mb4 unicode ci vs utf8mb4 default collation 附注大家都推荐使用utf8mb4 unicode ci 如果这如此受欢
  • 如何使用Python读取文件夹中的文件数量?

    如何使用Python读取特定文件夹中的文件数量 示例代码会很棒 要非递归地计算文件和目录 您可以使用os listdir http docs python org library os html os listdir并取其长度 要递归计算文
  • jstree选择节点

    问候 我正在使用 jsTree 生成分层数据 JsTree生成如下 function industries tree data type json opts url Admin GetIndustries 它可以找到并且 jsonresul
  • 在phonegap应用程序中导出sqlite数据库

    我们有一个使用 cordova phonegap 和他自己的 sqlite DB 的应用程序 我的意思是我们没有安装外部 sqlite 我们需要将数据库备份到 SD 内存中 但将 sqlite 文件从 PhoneGap 导出到 SD 时遇到
  • 在 Code::Blocks 中构建 wxWidgets 程序

    我正在尝试建立这个wxWidgets示例程序 http www wxwidgets org docs tutorials hworld2 txt使用 Code Blocks 12 11 但无论我尝试什么 构建都会失败 例如 构建日志显示以下
  • Flutter:等待 async void 方法

    我有一个写入文件系统的异步保存方法 返回类型为void 我想在保存完成后立即更新用户界面 通常我会使用 then 方法来做到这一点 但它不适用于 void 返回类型 那么 当保存完成后 我如何才能收到通知呢 void save Folder
  • 如何将 MouseListener 添加到 JList 项目?

    所以 我想要的是当JList选择项目后 将运行另一段代码 但我的问题是 我该如何实施MouseListeners对于具体的JList items 这是我的代码 public void launchFrame String selection
  • Python三元运算符不能返回多个值?

    我知道有些人不赞成这种做法 但我喜欢使用 Python 的三元运算符 因为它使操作变得简单if else陈述读起来更清晰 我认为 无论如何 我发现我不能这样做 gt gt gt a b 1 2 if True else 0 0 Traceb
  • 嵌套 $(document).ready() 和 $(window).load() 事件之间的区别

    我知道这些状态之间的基本区别 但我们的一个项目出现了一个奇怪的问题 jQuery document ready function console log Dom is ready jQuery document ready function
  • 如何保护 Django Rest Framework 中注册和登录 API 的安全?

    我曾经并且现在可能几乎每个 Django Framework 用户都使用 Django Rest Framework 来创建 REST API 我将其与令牌身份验证一起使用django rest framework jwt https gi
  • 对于以双向关系连接的节点,cypher 返回两次

    我有 2 个节点 A B 通过 FRIEND 连接 当我运行以下命令时 start n node match n r FRIEND b return n name b name 它返回 2 行 A B 和 B A 我想知道如何让它只返回一条
  • 无法连接到 Kubernetes 中的 Mongodb pod(连接被拒绝)

    我有一些远程虚拟机 我想在其中部署一些 Mongodb 实例 然后使它们可以远程访问 但由于某种原因 我似乎无法完成这项工作 这些是我采取的步骤 我启动了一个在远程虚拟机上运行 Mongodb 的 Kubernetes pod 然后我通过
  • 无法安装 hubot - 未满足 npm 依赖关系

    在尝试部署 hubot 时 npm 不断抱怨未满足的依赖关系 该文档没有解释如何解决这个问题 yum install npm enablerepo epel yum install nodejs enablerepo epel cd opt
  • 数据库表中每条记录的唯一字符串

    在我的 Asp Net MVC 5 项目中 我首先使用实体 框架代码来处理 MS SQL 数据库 假设这是表 public class Ticket Key public int Id get set Required public str
  • 如何使用带连字符的 ES6 导入

    我真的不知道该怎么做 也不知道如何谷歌 现在我有这个 let source require vinyl source stream 我想更改为导入 但这不起作用 import vinyl source stream as source fr
  • PySNMP:导入错误:没有名为 pyasn1.compat.octets 的模块

    我尝试在 Windows 上使用 PySNMP 但是当我尝试导入 cmdgen 时 我看到以下错误 from pysnmp entity rfc3413 oneliner import cmdgen ImportError No modul
  • GWT 应用程序中使用的 Javascript 通用 clone() 方法

    我试图编写一个通用克隆函数 它应该能够进行真正的深度克隆 我遇到过这个链接 如何在 javascript 中深度克隆 https stackoverflow com questions 4459928 how to deep clone i