Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Круговые ссылки (https://javascript.ru/forum/misc/7247-krugovye-ssylki.html)

B~Vladi 22.01.2010 11:59

Круговые ссылки
 
Вот пример кода:
function UI(){
    
}
  
function SystemObject(){
  this.UI.parent = this;
}

SystemObject.prototype.UI = new UI();

var sysObject = new SystemObject;

Получается:
sysObject.UI.parent.UI.parent.UI.parent.UI.parent...

Не приведёт ли это к утечке памяти или к большому её засиранию?
Достаточно ли удалить переменную, чтобы все ссылки убил сборщик мусора?
И как можно подстраховаться, чтобы такого не происходило?

Niar 22.01.2010 12:14

А тебе вообще зачем такой код?

B~Vladi 22.01.2010 12:43

Цитата:

Сообщение от Niar
А тебе вообще зачем такой код?

Вот пример:
function UI(){
    
}
UI.prototype.method = function(){
  
}
  
function SystemObject(){
  this.UI.parent = this;
}

SystemObject.prototype.UI = new UI();

var sysObject = new SystemObject;

sysObject.UI.method();


При вызове метода method, this будет указывать на объект sysObject.UI, а мне нужно внутри метода получить sysObject. Обращаться напрямую sysObject нельзя. Например:
new SystemObject().method();

Т.к. ссылки нет - обратиться напрямую невозможно, а надо.

PeaceCoder 23.01.2010 13:48

function UI(){
    
}
  
function SystemObject(){
  this.UI.parent = this;
}

SystemObject.prototype.UI = new UI();

var sysObject = new SystemObject;

Насколько я знаю при таком способе UI.parent хранит ссылку на родителя а не весь обьект. и как бы ты не извращался никакого захламления не будет. Ты же не callbackи делаешь когда меняешь звено цепочки. Это тоже самое что ты обращаешься в this в кажом методе.

B~Vladi 23.01.2010 15:03

Цитата:

Сообщение от PeaceCoder
Это тоже самое что ты обращаешься в this в кажом методе.

Вот это мне и надо... В идеале нужно примерно такое:
obj.property.method = function(){
  this // ссылка на obj.
}

Вот не знаю как правильно придумать...

Octane 23.01.2010 15:21

Цитата:

Сообщение от B~Vladi
function UI() {
     
}
   
function SystemObject(){
  this.UI.parent = this;
}
 
SystemObject.prototype.UI = new UI();
 
var sysObject = new SystemObject;

что-то как то запутано, почему не сделать так:
function SystemObject(){
    this.ui = new UI(this);
}

function UI(sObj) {
    this.sObj = sObj;
}
 
var sysObject = new SystemObject;
?
таже циклическая ссылка получится:
sysObject.ui.sObj.ui.sObj.ui…

B~Vladi 23.01.2010 18:42

Цитата:

Сообщение от Octane
что-то как то запутано

Да ничего тут не запутано:)
Цитата:

Сообщение от Octane
почему не сделать так

Ну тут логика уже другая - создается новый объект UI при каждом вызове конструктора SystemObject, увеличивая этим занимаемую память. А так объект UI уже находится в прототипе. В общем так нельзя.

Octane 23.01.2010 19:00

хм… если ты планируешь заводить несколько экземпляров SystemObject, то почему у тебя при каждом вызове конструктора перезаписывается ссылка parent, изменения для всех экземпляров же произойдут, так нужно?)

B~Vladi 24.01.2010 00:37

Цитата:

Сообщение от Octane
хм… если ты планируешь заводить несколько экземпляров SystemObject, то почему у тебя при каждом вызове конструктора перезаписывается ссылка parent, изменения для всех экземпляров же произойдут, так нужно?)

Все правильно. UI будет получать ссылку на нужный объект при каждом вызове метода.


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