2013-05-08 2 views
1

Я пытаюсь изменить Object в другом классе. Так что у меня есть что-то вроде этого:Как пройти по ссылке в ActionScript?

MainClass.as:

.. 
var myObject:Object = new Object(); 
Class2_Instance.get_JSON(myObject); 
trace(myObject.id); // output: undefined. whereas it should be 42. see below. 
.. 

Class2.as

public function get_JSON(url:String , the_object:Object) 
{ 
    var request:URLRequest = new URLRequest(url); 
    var variables:URLLoader = new URLLoader(); 
    variables.dataFormat = URLLoaderDataFormat.TEXT; 
    variables.addEventListener(Event.COMPLETE, Complete_Handler_JSON(the_object)); 
    try 
    { 
     variables.load(request); 
    } 
    catch (error:Error) 
    { 
     trace("Unable to load URL: " + error); 
    } 
} 

function Complete_Handler_JSON(the_object:Object):Function 
{ 
    return function(event:Event):void 
    { 
    var loader:URLLoader = URLLoader(event.target); 
    the_object = JSON.parse(loader.data);  
    trace(the_object.id); //returns 42. 
    }; 
} 

Так операция JSON выполняет правильно в Class2, и он присваивает .parse() значение the_object, но я думаю, что я не понимаю с логикой AS-pass-by-reference. Поскольку я ожидал, что myObject в MainClass.as тоже изменится.

Что мне сделать, чтобы изменить значение аргумента функции (myObject) напрямую?

Спасибо!

+0

объекты передаются по ссылке по умолчанию. the_object не myObject. Попробуйте вернуть объект__объекта после его создания в Class2_Method. Вы можете обнаружить, что в долгосрочной перспективе вам лучше идти с другим дизайном, чем статические методы. –

+0

@AmyBlankenship Спасибо, сегодня у меня возникли трудности с возвратом из CompleteHandler (так как они ждут завершения URLRequest, «асинхронный» - это термин, который я предполагаю), поэтому я пытался найти способ без возврата. И что вы подразумеваете под нестационарными методами? И я думаю, что я должен отредактировать свой вопрос, чтобы добавить фактический код. – void

+0

Я действительно смущен. если the_object не является myObject, тогда как это «pass-by-reference»? И в руководстве Adobe.com говорится, что значение myObject WILL изменится, но это не так:/И я не могу вернуться из CompleteHandler. Итак, как я могу сохранить массив JSON? – void

ответ

2

Objects передаются по ссылке.

Но, как я вижу в вашем коде, вы переписываете the_object еще одним на линии: the_object=JSON.parse(loader.data).

Вы можете создать новую переменную, а затем скопировать значения в the_object:

var json:Object = JSON.parse(loader.data); 
for (var k:String in json) { 
the_object[k]=json[k]; 
} 
+0

Спасибо! Да, я нашел решение, очень похожее на это сейчас. Но я привык делать это, как в вопросе, в C#, который также является передачей по ссылке. Разве это не должно быть так, как я его переписываю? Я имею в виду, что свойства объектов передаются по ссылке, но не сами объекты. Зачем ? – void

+1

Потому что теперь это совершенно другой объект. Старый код по-прежнему ссылается на код вызова. Обратите внимание, как приведенный выше код копирует все объекты с * нового * объекта, созданного JSON.parse, на ваш существующий объект. –

5

Проблема не в этой строке в обработчике события:

the_object = JSON.parse(loader.data); 

Минута вы сделаете это, вы больше не имеем дело с объектом, который вы передали в метод. Вы назначаете новое значение локальной переменной с именем the_object. Важно понимать, что объекты не передаются по ссылке - ссылки на объекты передаются по значению. Итак, the_object в вашем методе копия ссылки. Когда вы назначаете новое значение, эта копия перезаписывается другой ссылкой.

Решение состоит в том, чтобы передать ссылку по ссылке - это связано с концепцией двойных указателей в таких языках, как C++, также называемой двойной косвенностью. Я не уверен, что это возможно даже в ActionScript.

Лучшее решение, просто верните десериализованный объект в качестве возвращаемого значения.

+0

Ничего себе. это объясняет мой вопрос. Большое спасибо Мэтту!К сожалению, я не могу вернуться из этой функции, так как она выполняется асинхронно, но я буду помнить об этой «двойной ссылке». Благодаря ! – void

+0

Ах, в асинхронном сценарии вы можете вместо этого вернуться к типу «обещание»> http://en.wikipedia.org/wiki/Futures_and_promises Снова я не уверен, поддерживает ли ActionScript это. – MattDavey

+0

Это не значение передаваемого объекта, а ссылка на объект. То, что ожидало @void, было ссылкой на ссылку;) – Patrick

Смежные вопросы