Присвоение по ссылке в JavaScript

AHTIXPICT

Новичок
Присвоение по ссылке в JavaScript

Подскажите кто силен в JS

Есть там такакя фишка как в PHP (b = &a) или нет
 

vasa_c

Новичок
dark-demon, хватит бедных новичков путать рассказами про присвоение объектов по ссылке :)

Код:
var a = new Object();
var b = a;
a = 5;
alert(b); // Ведь не 5 же!
AHTIXPICT,
аналога b = &a в JS нет.
А объекты в JS присваиваются точно так же, как и в PHP5
 

dimagolov

Новичок
2 All
не хочеться поднимать флейм, но в JS переменные это и есть ссылки на объекты.
то есть new Object () создает объект, а var a = определяет а локальном пространстве имен переменную a и присваивает ей ссылку на созданный в правой части выражения объект.
дальше создается переменная b и та как a содержит ссылку на объект, то в b записывается ссылка на тот же объект. то есть ссылка в b пишеться не на a (a потом вообще не при делах оказывается), а на объект, ссылку на который содержит a (простите за тавтологию).
а вот в 3-й строчке переменной a присваивается "простой тип", то есть одна из ссылок на объект умирает, но объект живет, так как есть ссылка из b.

все это происходит из того, что в JS нету классов, а есть только объекты. и созданный конструктором объект существует пока на него есть ссылки. с ссылками можно делать самые разные вещи. например можно создать в одном документе объект, ссылку на него передать в другой, а потом первый документ убить. при этом ссылка останется жить и даже данные внутри того объекта будут доступны, но методы выполнить будет нельзя (по крайней мере в ИЕ, в других я такой изврат не проверял)

ЗЫ Не надо писать на JS как на PHP. Из этого ничего не выйдет - уж больно разные объектные модели у них.
 

vasa_c

Новичок
Переменные в JS, это не ссылки на объекты (не все).
Переменные, как обычно содержат значения каких-то типов — String, Number и т.д. Один из возможных типов — reference type — ссылка на внутреннюю структуру, представляющую объект. Объект содержит набор именованных свойств, которые так же содержат значения каких-то типов. И так далее.

И отсутствие классов в JS на это никак не влияет. В PHP есть классы, но всё тоже самое.
 

dark-demon

d(^-^)b
> Ведь не 5 же!

и не должно быть 5. "присваивание переменной значения по ссылке" означает, что она примет это значение без его копирования в отдельную облать памяти ( ptr1= ptr2 ). а то, что ты подразумевал в коде - это самое обычное присваивание ( *ptr1= *ptr2 ). разница в том, что в первом случае (js) указатель указывает на объект ( доступ к объекту - *ptr ), а во втором (php) - на ссылку на объект ( доступ к объекту - **ptr ).


> аналога b = &a в JS нет.

а вот с этим согласен.
 

vasa_c

Новичок
означает, что она примет это значение без его копирования в отдельную облать
Не факт. Что и куда в памяти копируется, это детали реализации каждого конкретного движка. Не нужно ими новичков насиловать. Многие из них даже не поймут, что такое "**ptr" :)
 

dimagolov

Новичок
Автор оригинала: vasa_c
И отсутствие классов в JS на это никак не влияет. В PHP есть классы, но всё тоже самое.
Я имел в виду динамическое (пере)определение ф-й в JS и возможность динамически менять/добавлять любые свойства в объектах и их прототипах. Это сильно влияет на то что интерпретатор позволяет и не позволяет делать и как он создает и изменяет объекты. Разные объектные парадигмы порождают разные языковые возможности.
 

vasa_c

Новичок
Динамическое переопределение функции не относится к ООП :)
У Python class-based ООП, но там тоже можно менять/добавлять любые свойства и методы.
 
Сверху