相关疑难解决方法(0)

如何在javascript中深度克隆

你如何深度克隆Javascript对象?

我知道基于类似的框架有各种各样的功能JSON.parse(JSON.stringify(o)),$.extend(true, {}, o)但我不想使用这样的框架.

什么是创建深度克隆的最优雅或最有效的方法.

我们关心像克隆数组这样的边缘情况.不打破原型链,处理自我引用.

我们不关心支持复制DOM对象,因为因为.cloneNode这个原因而存在.

由于我主要想使用深度克隆来node.js使用V5引擎的ES5功能是可以接受的.

[编辑]

在任何人建议让我提及之前,通过原型继承对象并克隆它来创建副本之间存在明显差异.前者使原型链变得混乱.

[进一步编辑]

在阅读完答案后,我发现了一个令人讨厌的发现,即克隆整个物体是一个非常危险和困难的游戏.以下面的基于闭包的对象为例

var o = (function() {
     var magic = 42;

     var magicContainer = function() {
          this.get = function() { return magic; };
          this.set = function(i) { magic = i; };
     }

      return new magicContainer;
}());

var n = clone(o); // how to implement clone to support closures
Run Code Online (Sandbox Code Playgroud)

有没有办法编写克隆对象的克隆函数,在克隆时具有相同的状态,但是如果不在oJS中编写JS解析器,则无法改变状态.

这样的功能不再需要现实世界.这仅仅是学术兴趣.

javascript

95
推荐指数
6
解决办法
10万
查看次数

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

我试图编写一个通用克隆函数,它应该能够进行真正的深度克隆.我遇到过这个链接,如何深入克隆javascript并从那里获取功能.

当我尝试使用直接Javascript时,该代码工作得很好.我在代码中做了一些小修改,并尝试在GWT中输入JSNI代码.

克隆功能:

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 …
Run Code Online (Sandbox Code Playgroud)

javascript gwt jsni gwt-2.5

6
推荐指数
1
解决办法
548
查看次数

标签 统计

javascript ×2

gwt ×1

gwt-2.5 ×1

jsni ×1