2013-01-11 34 views
7

Trong javascript console nếu tôi làm điều này,GWT để Javascript chuyển đổi

a = [1,2,3] 
    Object.prototype.toString.call(a) // gives me "[object Array]" 
    typeof a // gives me "object" 

Nếu tôi tạo một ArrayList trong GWT và vượt qua nó đến một phương pháp tự nhiên và làm được điều này,

// JAVA code 
    a = new ArrayList<Integer>(); 
    a.push(1); 
    a.push(2); 

    //JSNI code 
    Object.prototype.toString.call(a) // gives me "[object GWTJavaObject]" 
    typeof a // returns "function" 

gì chính xác là sự khác biệt giữa cả hai? Có phải GWTJavaObject giống hệt với Mảng?

Tại sao typeof trở lại "đối tượng" trong tinh khiết javascript nhưng "chức năng" trong GWT?

Câu hỏi tóm tắt là, chính xác những đối tượng GWT được chuyển đổi thành Javascript là gì? Toàn bộ mã số có tại đây.

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

      Window.alert(nativeMethodCode(list)); 
       Window.alert(nativeMethodCode2(list)); 
     } 

     public static final native Object nativeMethodCode(Object item) 
     /*-{ 
      return Object.prototype.toString.call(item); 
     }-*/; 

     public static final native Object nativeMethodCode2(Object item) 
     /*-{ 
      return typeof item; 
     }-*/; 
+0

Về cơ bản, bạn đang hỏi cách triển khai GWT. Đó là những gì bạn có ý định, hoặc là có một cái gì đó cụ thể hơn? – Potatoswatter

+0

Cảm ơn bạn đã phản hồi nhanh. Đang cố gắng sử dụng JSNI bên trong GWT, đó là nơi tất cả các câu hỏi này xuất hiện, bởi vì các phương thức tôi viết trong JSNI hoạt động trong giao diện điều khiển trình duyệt nhưng không phải trong GWT. – LPD

+0

theo [this] (https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#passing-java), không thể truy cập các mảng Java từ mã JSNI. Xin lỗi ... hy vọng trang đó và giúp bạn thực hiện một cách giải quyết (chắc chắn là có thể). – Potatoswatter

Trả lời

3

Một ArrayList trong GWT không dịch sang một mảng JS tinh khiết: đó là một lớp mở rộng AbstractList và thực hiện một loạt các giao diện, và thông tin này nên được giữ khi dịch sang JS để instanceof kiểm tra (trong Java của bạn mã, ví dụ: instanceof List hoặc instanceof RandomAccess) vẫn hoạt động như mong đợi. Do đó, ArrayList được triển khai dưới dạng một wrapper xung quanh một mảng JS, xem https://code.google.com/p/google-web-toolkit/source/browse/tags/2.5.0/user/super/com/google/gwt/emul/java/util/ArrayList.java. Lưu ý rằng một mảng Java được dịch sang một mảng JS, nhưng phải rất cẩn thận về những gì bạn làm với nó trong JSNI khi bạn có thể phá vỡ các giả định Java hơn nữa (ví dụ: một mảng có kích thước cố định).

+0

Cảm ơn bạn đã trả lời. Điều đó có nghĩa là, bản dịch GWT không nhất thiết cung cấp tất cả các chức năng được đưa ra bởi các mảng JS? Am yêu cầu điều này bởi vì tôi đang cố gắng để có một tính năng bản sao sâu trong ứng dụng GWT của tôi bằng cách sử dụng mã JSNI như được giải thích trong liên kết này. http://stackoverflow.com/questions/14273509/javascript-generic-clone-method-used-in-gwt-application. Nếu nỗ lực này để tìm một phương pháp "sao chép sâu" chung được gỡ bỏ tất cả cùng nhau? – LPD

+0

Giống như ví dụ tôi đã đưa ra, đối tượng GWT đã dịch có hỗ trợ các tính năng đối tượng JS như obj.prototype hoặc obj.constructor không? – LPD

+0

Các đối tượng được dịch GWT là các đối tượng JS, vì vậy chúng thực sự có một nguyên mẫu và một hàm tạo. –

Các vấn đề liên quan