Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   А можно передавать объект не по ссылке, а по значению? (http://www.flasher.ru/forum/showthread.php?t=63087)

Zloglik 15.09.2004 21:29

А можно передавать объект не по ссылке, а по значению?
 
Писал вот что-то в таком духе:
a={};
b={};
a=b;
a.q="a";
И с некоторым удивлением обнаружил, что при этом b.q="a",
причем связь эта динамически отслеживается, так что получилась паразитная (в моем случае) обратная связь.
Не придумал ничего лучше, чем приравнивать каждое свойство по отдельности, но сдается мне способ достаточно извращенский. Может кто подскажет что-нибудь поумнее, а?
З.Ы. И еще вопрос не по теме однако тоже весьма меня интересующий: как удалить все элементы массива разом?

gason 16.09.2004 00:46

как да как
 
a наследник б
a=[1,2,3,4,5]; // вот создал
a.length = 0; // вот удалил



// а еще смотри как ты удивишься ...

b={}
a=b
b.q = 1;
trace (a.q)

/* да бывают чудеса на свете, чтоб чудес не было книги нада читать, а не ломать голову другим людям!. не обж.. шучу
*/

Zloglik 17.09.2004 15:47

Цитата:

Оригинал написал(а) gason
a=[1,2,3,4,5]; // вот создал
a.length = 0; // вот удалил
[/b]
За это спасибо

Цитата:

Оригинал написал(а) gason
// а еще смотри как ты удивишься ...
b={}
a=b
b.q = 1;
trace (a.q)
[/b]
А вот и не удивлюсь - это я и сам сообразил
Вопрос, то, собственно, в чем?
Как сделать так чтобы a не отслеживал изменений b

Цитата:

Оригинал написал(а) gason
/* да бывают чудеса на свете, чтоб чудес не было книги нада читать, а не ломать голову другим людям!. не обж.. шучу
*/ [/b]
Читаю. А вообще, весьма непротсто найти нормальную книжку
99% - тупые самоучители

dimarik 17.09.2004 16:14

Re: как да как
 
Цитата:

Оригинал написал(а) gason
a наследник б
"а" есть ССЫЛКА на "b"

Zloglik 17.09.2004 20:07

Блин, да знаю я что a - ссылка на b

dimarik 17.09.2004 20:17

Цитата:

Оригинал написал(а) [subway]design
Насчет "массивов" это все, конечно, верно, но лично для меня в АС неудобна следующая "фишка":
В АС нет такой вещи, как указатель или оператор ссылки (в Си++ - &). И все присваивания по ссылке/по значению происходят автоматически. Как это реализуется:

obj={a:10};
objRef=obj;
objRef.a++;
trace(obj.a); // выдает 11.

Типичный пример автоматического присваивания адреса объекта, а не его содержимого другой переменной при прямом присваивании, даже, если переменная - объект того же класс. Это справедливо, хотя бывает неудобно при копировании массивов ("массив" - объект класса Array). Поэтому пригодиться такой код:

Array.prototype.copy=function(a)
{
this.splice(0);
for(i=0;i<a.length;i++)
{
this[i]=a[i];
}

};

Как пользоваться можно догадаться.

Отступление: в случае копирования объектов оператором присваивания пригодилась бы возможность перегрузки функций, которая повлекла бы за собой введение типов данных, что сделало бы АС неудобным для "легких" скриптов.
...

Хуже становится, когда надо передать ссылку на скаляр (строку или число), а они при присваивании/передачи в ф-цию копируются и передают значение. Это совсем хреново, так как иногда требуется строгая независимость объектов, но одни объекты должны передавать другим ссылки на свои элементы, причем имена этих эл-тов должны быть известны только содержащему их объекту. А если такой элемент - скаляр?

Такие дела.

взято отсюда

dimarik 17.09.2004 20:19

Копировать объект, может что-то типа этого.


Код:

Object.prototype.copy = function()
{
        var tempObj = new Object();
        for (var i in this)
        {
                tempObj[i] = this[i];
        }
        return tempObj;
}

Использование.
Код:

a = new Object();
a.q = 100;

b = a.copy();
b.q = 200

trace(a.q);
trace(b.q)

P/S/ По-спокойней надо быть. :)

Lorex 17.09.2004 20:25

попоробуй сделать функцию, которая создает другой обьект и "врукопашную" копируй туда значения... может так "наводить"не будет....не пробовал,...

iNils 18.09.2004 11:39

три раза одно и тоже )

a = [5];
b = a.slice (0);

trace ("до");
trace (a);
trace (b);
b[0] += 7;
trace ("после");
trace (a);
trace (b);

Жень Шень 18.09.2004 11:44

Цитата:

Оригинал написал(а) Zloglik

А вот и не удивлюсь - это я и сам сообразил
Вопрос, то, собственно, в чем?
Как сделать так чтобы a не отслеживал изменений b

Может это поможет проблеме?
a = new Array("a1", "b1", "c1");
b = new Array();
b = a.concat();
trace(b[0]);
trace(b[1]);
trace(b[2]);
b[0]= "f1"
trace(a[0]);
trace(b[0]);
Есть еще один полезный метод: slice()


Часовой пояс GMT +4, время: 17:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.