2
A
回答
2
基於Lineman78的answer並考慮到從A利維這個其他answer我創建了以下功能:
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 (obj == null) return obj;
var copy;
if (obj instanceof Date) {
// Handle Date
copy = new Date();
copy.setTime(obj.getTime());
} else if (obj instanceof Array) {
// Handle Array
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
if (obj[i] == null || typeof obj[i] != "object") copy[i] = obj[i];
else copy[i] = @com.amindea.noah.client.utils.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[i]);
}
} else {
// Handle Object
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
if (obj[attr] == null || typeof obj[attr] != "object") copy[attr] = obj[attr];
else copy[attr] = @com.amindea.noah.client.utils.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[attr]);
}
}
}
return copy;
}-*/;
}
它支持對象的深層副本,數組,日期,字符串,數字,或布爾值。正如A. Levy所解釋的那樣,只要對象和數組中的數據形成樹結構,該函數就會工作。
5
有兩種方法,我會考慮。大部分時間覆蓋對象都與JSON結合使用,所以你可以隻字符串化的對象,並解析結果:
public native MyOverlayType deepCopy()/*-{
return JSON.parse(JSON.stringify(this));
}-*/;
OR
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());
}
另一種選擇是一個純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;
}-*/;
}
0
我發現克隆JavaScriptObject最簡單的方法是使用由GWT提供的JsonUtils類:
import com.google.gwt.core.client.JsonUtils;
final String taskJson = JsonUtils.stringify(selectedTask);
TaskJso task = JsonUtils.safeEval(taskJson).cast();
相關問題
- 1. 深入覆蓋WebMatrix?
- 2. Python C APi深度複製
- 3. 深度複製嘗試
- 4. 如何深度複製
- 5. 深度複製Java中
- 6. 深度複製散列表
- 7. GWT css樣式覆蓋
- 8. 測試GWT覆蓋類型
- 9. 覆蓋元素樣式,爲GWT圖像定義高度/寬度
- 10. 顛覆切換到深度
- 11. Python:深層複製TypedList類繼承列表和覆蓋附加問題
- 12. 控制Fancybox2覆蓋淡入速度
- 13. 在Django模型中覆蓋深度拷貝
- 14. shutil複製tempfile覆蓋另一個
- 15. 覆蓋SCons緩存複製函數
- 16. 複製文件夾,而不會覆蓋
- 17. 複製文件沒有覆蓋
- 18. net :: scp複製/覆蓋文件夾
- 19. 覆蓋matplotlib.artist.Artist繪製複雜形狀
- 20. 如何複製jQuery live()stopPropagation覆蓋on()
- 21. css覆蓋寬度
- 22. Java LinkedList.get()不返回深度複製?
- 23. C++深度複製鏈接列表
- 24. 深度複製2維對象陣列
- 25. 深度複製NSMutableArray的問題
- 26. 樹視圖節點的深度複製
- 27. jquery.extend(true,[],obj)不創建深度複製
- 28. C:深度複製 - 結構,空指針
- 29. c#線程安全深度複製
- 30. 創建深度複製方法,Java
你在哪裏定義clone_obj功能?使用JSNI進行遞歸是我發現更困難的事情之一。 – 2011-01-19 00:49:43