ITは遊び

毎日パソコンのことばかり考えてる

Titanium MobileでTitaniumのオブジェクトにTitaniumのオブジェクト以外のオブジェクトを参照渡ししても参照渡しにならない!

※追記
参照渡しにする方法は変わった方法だけどありました:Titanium MobileでTitaniumのオブジェクトにTitaniumのオブジェクト以外のオブジェクトを参照渡しさせるには - ITは遊び

以下が全て。

// 普通にマイオブジェクトを作る
var myObject = {};
myObject.val = "before_val";

// Titaniumのオブジェクトを作り、マイオブジェクトを持たせる
var tiObject = Titanium.UI.createButton();
tiObject.myObject = myObject;

// 普通のJavascriptのオブジェクト、マイオブジェクトを持たせる
var stnObject = {};
stnObject.myObject = myObject;

// マイオブジェクトを更新する
myObject.val = "after_val";

// 中身を確認すると・・・
// Titaniumのオブジェクトの方は、変わっていない!参照で渡せていない!
Ti.API.info("TitaniumObject:" + tiObject.myObject.val);     // [INFO] TitaniumObject:before_val
// 普通のJavascriptのオブジェクトの方は、当然参照で渡せているので、値が変わる
Ti.API.info("JavaScriptObject:" + stnObject.myObject.val);  // [INFO] JavaScriptObject:after_val

// 別のTitaniumのオブジェクトを作ってみる
var tiObject2 = Titanium.UI.createButton();
tiObject2.val = "before_val";

// Titaniumのオブジェクトを渡してみる
tiObject.tiObject2 = tiObject2;
stnObject.tiObject2 = tiObject2;
	
// Titaniumのオブジェクトを更新する
tiObject2.val = "after_val";

// 中身を確認すると・・・
// Titaniumのオブジェクトの方は、参照で渡せてるじゃん!
Ti.API.info("TitaniumObject:" + tiObject.tiObject2.val);    // [INFO] TitaniumObject:after_val
// 普通のJavascriptのオブジェクトの方ももちろん渡せている。
Ti.API.info("JavaScriptObject:" + stnObject.tiObject2.val); // [INFO] JavaScriptObject:after_val

// 参照渡ししたはずの中身を変更してみる
tiObject.myObject.val = "change_val_ti";
tiObject.tiObject2.val = "change_val_ti";

// 中身を確認すると
// もしかして変更もできない?!
Ti.API.info("TitaniumObject:" + tiObject.myObject.val);    // TitaniumObject:before_val
// 普通に変更できている
Ti.API.info("JavaScriptObject:" + tiObject.tiObject2.val); // JavaScriptObject:change_val_ti
// 変更元も当然変更されていない
Ti.API.info("MyObject:" + myObject.val);                   // MyObject:after_val
// Titaniumオブジェクトであれば参照渡しだから変更されている
Ti.API.info("TitaniumObject:" + tiObject2.val);           // TitaniumObject:change_val_ti

つまり、TitaniumのオブジェクトにJavascriptのオブジェクトを渡しても、参照渡しにならず、中身を変更すらできない不思議なオブジェクトになる様子。でも、TitaniumのオブジェクトにTitaniumのオブジェクトを渡すと、普通に参照渡しになる。

iOSの場合のチェックなので、もしかしたらAndroidだと違うのかも。