makes sens.
I have noticed that if it is explicitly set to null then it will be set to
null in Js as well, once again it gets translated to Js :)
Thanks for the clear cut explanation!
Le mardi 29 août 2017 13:16:45 UTC+2, Thomas Broyer a écrit :
>
>
>
> On Tuesday, August 29, 2017 at 12:36:11 PM UTC+2, zakaria amine wrote:
>>
>> Hello,
>>
>> This is a minor remark, and it does affect the functioning of JsInterop,
>> as far as I experienced, but may be worth looking into by GWT folks. I have
>> the following Js object that I am wrapping in Java:
>>
>> var Hotel = function() {
>> this.guests = [];
>> };
>>
>>
>> Hotel.prototype = {
>> addGuest : function(guest) {
>> this.guests.push(guest);
>> },
>> getGuestCount: function(){
>> return this.guests.length;
>> }
>> }
>>
>>
>> @JsType(isNative=true, namespace=GLOBAL)
>> public class Hotel {
>> @JsMethod
>> public native final int getGuestCount();
>>
>> @JsMethod
>> public native final void addGuest(Guest guest);
>> }
>>
>> I pass a Guest object to the addGuest Method
>>
>> @JsType(isNative=true, namespace=GLOBAL, name="Object")
>> public class Guest {
>>
>> public int guestId;
>>
>>
>> public String firstName;
>>
>>
>> public String lastName;
>>
>> public String roomNumber;
>> }
>>
>>
>> public class Test implements EntryPoint {
>>
>>
>> String uninitializedString;
>>
>> public void onModuleLoad() {
>>
>>
>> Hotel hotel = new Hotel();
>>
>>
>> Guest guest = new Guest();
>> guest.firstName= "test";
>> //passed object is guest = {firstName: "test"}
>> hotel.addGuest(guest);
>>
>>
>> Guest guest2 = new Guest();
>> guest2.firstName = "test";
>> guest2.lastName = uninitializedString;
>> //passed object is guest = {firstName: "test", lastName: undefined},
>> should also be guest = {firstName: "test"}
>> hotel.addGuest(guest2);
>> }
>>
>> }
>>
>>
>> In short, if you are assigning an uninitialized variable to an
>> uninitialized Object field, the field will not be ignored anymore by
>> JsInterop, and will be transpiled as undefined, although it is still
>> uninitialized. This happens often with the builder pattern.
>>
>
> Let's translate your code to JS manually:
>
> let uninitializedString;
>
> function onModuleLoad() {
> let hotel = new Hotel();
>
> let guest = new Object(); // because you used name="Object"; at that
> point, guest is {}
> guest.firstName = "test";
> hotel.addGuest(guest);
>
> let guest2 = new Object();
> guest2.firstName = "test";
> guest2.lastName = unitializedString;
> hotel.addGuest(guest2);
> }
>
> See? your property assignments are creating the properties on a bare JS
> Object, and assigning 'undefined' will still create the property.
>
> Also keep in mind that what you declare in your native types are only
> mapping about how to use/call the JS API, not necessarily what it actually
> is under the hood; i.e. just because you use a field does not mean that
> it's actually a "simple" JS property: it could have been defined with a
> setter, so guest2.lastName=undefined might actually have a side-effect
> other than creating a property (that's exactly that kind of property that's
> declared when you use getter/setter methods for a @JsProperty in a
> non-native type); and conversely, you could use getter/setter methods for a
> @JsProperty in a native type, that's a "simple" property in JS.
>
> BTW, the 'undefined' here is seen by GWT as a Java 'null', but it won't
> bother initializing the field with 'null' as it treats 'undefined' and
> 'null' as equivalent (to a Java 'null'); this is an optimization technique
> (saves a few bytes in generated payload, and CPU cycles at runtime) that
> IIRC was added at some point in the GWT 2 lifecycle; earlier versions would
> explicitly initialize the uninitializedString field to null in the Test
> constructor/initializer.
>
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.