Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   копия объекта из функции (https://javascript.ru/forum/misc/56996-kopiya-obekta-iz-funkcii.html)

ivan_antonov 14.07.2015 15:39

копия объекта из функции
 
function Test() {
        var t = { e: 3 };

        return { c: t };
    }

    var a = Test();
    var b = Test();

    a.c = undefined;
    alert(b.c.e)


Объясните, пожалуйста, почему "a.c" не влияет на "b.c"? Ведь и там и там свойство "с" это ссылка на один и тот же объект?

ivan_antonov 14.07.2015 15:44

почему "a.c = undefined;" не изменяет объект для b? ведь он просто ссылается на "t", который изменяет "a.c = undefined;"

Safort 14.07.2015 15:52

Цитата:

Сообщение от ivan_antonov (Сообщение 379547)
Объясните, пожалуйста, почему "a.c" не влияет на "b.c"? Ведь и там и там свойство "с" это ссылка на один и тот же объект?

Нет. Ты каждый раз создаёшь новый объект.

рони 14.07.2015 15:54

ivan_antonov,
каждый раз Test() создаёт новый обьект

Deff 14.07.2015 15:55

ivan_antonov,
с у Вас переменная(свойство) window
a.c и b.с - не имеют никакого отношения к с , тут с свойство конкретных объектов a или b

jackdempsey2015 14.07.2015 16:35

Цитата:

Сообщение от Deff
с у Вас переменная(свойство) window

с чего бы это?

Deff 14.07.2015 16:38

jackdempsey2015,
Он переименовал
Было так: c = undefined;

ivan_antonov 14.07.2015 19:02

Тогда почему же такая конструкция модифицирует исходный объект?
var t = { e: 3 };

        var d = t;
        d = { c: t };

        d.c.e = 5;


а когда "{ c: t }" возвращаю через return - уже не модифицирует

Erolast 14.07.2015 19:13

Цитата:

а когда "{ c: t }" возвращаю через return - уже не модифицирует
Что не модифицирует? Объект, на который также ссылается переменная t? Модифицирует.

ivan_antonov 14.07.2015 19:20

function Test() {
        var t = { e: 3 };

        return { c: t };
    }

    var d = Test();
    var b = Test();

    d.c.e = 77;
    alert(b.c.e);

в этом варианте исходное t не тронуто, а в нижнем модифицирует
var t = { e: 3 };
        var d = t;
        d = { c: t };
        d.c.e = 5;

ivan_antonov 14.07.2015 19:22

почему в первом варианте вот это "d.c.e = 77;" не тронуло исходное t? а во втором варинте, та же конструкция без return затронула t

ivan_antonov 14.07.2015 19:32

я так понимаю, return возвращает копию чтоли, а не ссылку на локальную переменную?

kostyanet 14.07.2015 21:18

Именно так. Самая мякотка что потребуется метод для модификации этой приватной проперти, ибо наружное изменение никакого влияния на внутренности не окажет.

jackdempsey2015 14.07.2015 21:32

Цитата:

Сообщение от ivan_antonov
в этом варианте исходное t


тебе уже пояснили, ты создаешь своей ф-ей 2 разных объекта, никакого исходного (общего для них обоих) t не существует, для каждого оно локально. return тут вообще не при чем, что ты ему скажешь то он вернет.

jackdempsey2015 14.07.2015 21:34

Цитата:

Сообщение от ivan_antonov
я так понимаю, return возвращает копию чтоли, а не ссылку на локальную переменную?

твой ретурн возвращает не копию и не ссылку, он возвращает новый объект. выражение {...} означает: создать новый объект(экземпляр Object) с (опционально) такими-то полями

kostyanet 14.07.2015 22:54

Цитата:

Сообщение от jackdempsey2015
он возвращает новый объект

А почему наружные изменения этого "возвернутого" объекта не проникают внутрь функции?

Я просто подумал что ТС привел пример с двумя объектами в порядке преобразования реальной задачи к абстрактной для форума, чтоб никто как не догадался что он там задумал. Поскольку задавать вопрос об ингрессе двух отдельных никак не связанных объектов это нонсенс.

jackdempsey2015 14.07.2015 23:01

Цитата:

Сообщение от kostyanet
А почему наружные изменения этого "возвернутого" объекта не проникают внутрь функции?

в каком смысле? ЯННП

kostyanet 14.07.2015 23:30

Ну в каком смысле - если снаружи в этот объект записать число, то внутри в этом объекте такого числа не будет.

Разумеется внутри делается объект по имени и он возвращается. Разницы тут никакой в том самом смысле.

jackdempsey2015 14.07.2015 23:32

kostyanet,
Короче, я завтра собираюсь бухать, если не забуду, я после поллитра гляну твое сообщение.

Erolast 15.07.2015 13:11

Цитата:

в этом варианте исходное t не тронуто, а в нижнем модифицирует
Тронуто, просто и на "d" и на "b" приходится своя собственная копия "t".

Цитата:

я так понимаю, return возвращает копию чтоли, а не ссылку на локальную переменную?
Не совсем.
Не существует никаких локальных переменных. Каждый вызов функции Test создает новую область видимости, в которой создаются абсолютно новые переменные, в которые записываются ссылки на абсолютно новые объекты.

Цитата:

Сообщение от safort
Нет. Ты каждый раз создаёшь новый объект.

Цитата:

Сообщение от рони
каждый раз Test() создаёт новый обьект

Цитата:

Сообщение от foo
твой ретурн возвращает не копию и не ссылку, он возвращает новый объект.



Часовой пояс GMT +3, время: 22:42.