Просмотр полной версии : А можно передавать объект не по ссылке, а по значению?
Писал вот что-то в таком духе:
a={};
b={};
a=b;
a.q="a";
И с некоторым удивлением обнаружил, что при этом b.q="a",
причем связь эта динамически отслеживается, так что получилась паразитная (в моем случае) обратная связь.
Не придумал ничего лучше, чем приравнивать каждое свойство по отдельности, но сдается мне способ достаточно извращенский. Может кто подскажет что-нибудь поумнее, а?
З.Ы. И еще вопрос не по теме однако тоже весьма меня интересующий: как удалить все элементы массива разом?
a наследник б
a=[1,2,3,4,5]; // вот создал
a.length = 0; // вот удалил
// а еще смотри как ты удивишься ...
b={}
a=b
b.q = 1;
trace (a.q)
/* да бывают чудеса на свете, чтоб чудес не было книги нада читать, а не ломать голову другим людям!. не обж.. шучу
*/
Оригинал написал(а) 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% - тупые самоучители
Оригинал написал(а) gason
a наследник б
"а" есть ССЫЛКА на "b"
Блин, да знаю я что a - ссылка на b
Оригинал написал(а) [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)
Копировать объект, может что-то типа этого.
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/ По-спокойней надо быть. :)
попоробуй сделать функцию, которая создает другой обьект и "врукопашную" копируй туда значения... может так "наводить"не будет....не пробовал,...
три раза одно и тоже )
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()
2 dimarik
Если верить [subway]design'у, то
В АС нет такой вещи, как указатель или оператор ссылки (в Си++ - &). И все присваивания по ссылке/по значению происходят автоматически
В этом я, собственно, и хотел убедиться.
По поводу копирования объектов for...in'ом - примерно так я
и думал. Спасибо :)
2 Lorex
см пост от dimarik'а от 17-09-2004 19:19
2 iNils
Что одно и то же?
2 Жень Шень
Ну, вообще-то имелся в виду экземпляр класса Object
Но насчет использования concat() без параметров -
это интересно, я не знал. Thanks :)
Итого:
Видимо, присвоить объект по значению в АС по-людски
нельзя, и необходимо пользоваться for...in.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.