GWT叠加深层复制

Jav*_*ero 2 gwt overlay clone

制作gwt叠加类型的深层副本的最佳方法是什么?

我正在寻找一个功能或库来检查GWT覆盖并克隆它.它必须能够克隆包含的数组或对象.

谢谢

LIN*_*N78 5

我会考虑两种方式.大多数情况下,覆盖对象与JSON一起使用,因此您可以对对象进行字符串化并解析结果:

public native MyOverlayType deepCopy()/*-{
  return JSON.parse(JSON.stringify(this));
}-*/;
Run Code Online (Sandbox Code Playgroud)

要么

public static native MyOverlayType fromJson(String json)/*-{
      return JSON.parse(json);
}-*/;
public native String getJson()/*-{
      return JSON.stringify(this);
}-*/;
public MyOverlayType deepCopy(){
      return fromJson(getJson());
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是纯javascript方法,它将维护其他东西,如函数指针,可能更有效.

public class JsoUtils
{
    @SuppressWarnings("unchecked")
    public static <T extends JavaScriptObject> T deepCopy(T obj)
    {
        return (T) deepCopyImpl(obj);
    }

    private static native JavaScriptObject deepCopyImpl(JavaScriptObject obj)/*-{
        if (typeof obj !== 'object' || obj === null) {
            return obj;
        }

        var c = obj instanceof Array ? [] : {};

        for (var i in obj) {
            if (obj.hasOwnProperty(i)) {
                if (typeof obj[i] !== 'object' || obj[i] === null)
                    c[i] = obj[i];
                else
                    c[i] = @com.example.gwt.client.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[i]);
            }
        }

        return c;
    }-*/;
}
Run Code Online (Sandbox Code Playgroud)