2016-05-26 2 views
0

Как установить текущий объект в значение null?Установить текущий объект на нуль

function ZPNode(){}; //Constructor 
function _destroy(){ 
    //this = null; --> Won't work obviously 
} 
ZPNode.prototype.remove = function(){ 
    //Remove node 
    _destroy.call(this); 
}; 

Редактировать: возможно, описание не было ясно. Что должно произойти:

var tree = ZPTree.create(jsonArr); 
var node = tree.findNode(1); 
node.remove(); 
console.log(node); //null 

Причина, по которой это просто. Вы не хотите, чтобы случайно сделать что-то вроде:

node.remove(); 
node.appendChild(anotherNode); //Oops 

Возможное решение заключается в работе с состоянием на объекте, если нет другого пути.

Редактировать 2: После дополнительных исследований, я не думаю, что это возможно в целом. Я неохотно пойду с обходным решением. Я могу сделать что-то вроде:

tree.removeNode(node); 

Хотя, по моему мнению, оно менее чистое.

+2

Думаю, вам стоит взглянуть на [этот ответ] (http://stackoverflow.com/questions/2304860/can-an-object-automatically-delete-itself-in-javascript-once-it-has- достигнуто-его) –

+0

, однако он не удалит сам объект. Ваша функция 'remove' не имеет эффекта – RomanPerekhrest

+0

Почему вы хотите это сделать? – Rayon

ответ

2

JavaScript автоматически собирает мусор; память объекта будет восстановлена, только если сборщик мусора решает запустить, и объект имеет право на это. Вам не нужно удалять внутри функции _destroy просто удалите все ссылки.

function ZPNode(){}; //Constructor 
function _destroy(){ 
    //this = null; --> Won't work obviously 
} 
ZPNode.prototype.remove = function(){ 
    //Remove node 
    _destroy.call(this); 
}; 

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

var obj = new ZPNode(); 
obj = null; 
+0

Это скорее вопрос api. Когда пользователь вызывает node.remove(); (который должен удалить текущий узел из дерева), экземпляр должен быть установлен в null. Я не хочу, чтобы они вставляли в node = node.remove(); – Trace

+0

пример уничтожить реализация функции _destroy() { \t // здесь вы можете удалить ссылки на другие объекты \t ссылки \t \t удалить this.element; \t // удалить элементы из dom \t \t \t this.elementNodeReference.Удалить(); \t \t // удалить глобальные ссылки \t delete window.ZPNodeTree; // window.ZPNodeTree = null; \t } –

+0

Спасибо за ваш вклад – Trace

0

В конечном итоге я нашел наиболее логичное решение для своего конкретного случая использования.
Это было так просто, как установить ссылку на текущее дерево 0.

this._treeId = 0; 

Это на самом деле не имеет значения, что узел продолжает существовать, так как он не был подключен к дереву больше.
Более того, было бы целесообразно сохранить существующий узел, поскольку он может быть повторно присоединен позже к другому узлу, который все еще подключен к дереву.

Спасибо за помощь.

Смежные вопросы