PDA

Просмотр полной версии : А можно передавать объект не по ссылке, а по значению?


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
Оригинал написал(а) 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];
}

};

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

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

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

Такие дела.

взято отсюда (http://www.flasher.ru/forum/showthread.php?s=&threadid=36761&perpage=15&pagenumber=4)

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()

Zloglik
18.09.2004, 19:42
2 dimarik

Если верить [subway]design'у, то

В АС нет такой вещи, как указатель или оператор ссылки (в Си++ - &). И все присваивания по ссылке/по значению происходят автоматически

В этом я, собственно, и хотел убедиться.

По поводу копирования объектов for...in'ом - примерно так я
и думал. Спасибо :)

2 Lorex

см пост от dimarik'а от 17-09-2004 19:19

2 iNils

Что одно и то же?

2 Жень Шень

Ну, вообще-то имелся в виду экземпляр класса Object
Но насчет использования concat() без параметров -
это интересно, я не знал. Thanks :)

Итого:

Видимо, присвоить объект по значению в АС по-людски
нельзя, и необходимо пользоваться for...in.