У меня есть класс Javascript, который содержит несколько функций и объектов-членов:Правильный способ сброса или очистки объекта Javascript?
function MyUtils()
{
// Member Variables (Constructor)
var x = getComplexData();
var y = doSomeInitialization();
// Objects
this.ParamHash = function()
{
// Member variables
this.length = 0;
this.items = new Array();
// Constructor
for (var i = 0; i < arguments.length; i += 2)
{
// Fill the items array.
this.items[arguments[i]] = arguments[i+1];
this.length++;
}
}
// Functions
this.doSomething = function()
{
// Do something.
// Uses the items in the ParamHash object.
for (var i in this.ParamHash.items)
{
// Really do something!
}
// Clear the ParamHash object -- How??
}
}
Это вызывается следующим образом:
// First call - works fine.
var utils = new MyUtils();
utils.paramHash = new utils.ParamHash("a", 1, "b", 2);
utils.doSomething();
// Don't want to re-initialize.
// utils = new MyUtils();
// Consequent call - crashes ["Object doesn't support this action."].
utils.paramHash = new utils.ParamHash("c", 3);
utils.doSomething();
Проблема возникает из-за ограничений, которые я хочу, чтобы повторно использовать тот же utils
объект по всему коду без необходимости его повторной инициализации. Кроме того, я хочу, чтобы объект ParamHash воссоздавался с нуля каждый раз, когда я его вызываю. Однако последующие вызовы конструктора ParamHash вызывают ошибку «Object не поддерживает это действие». На этом этапе я вижу, что объект utils.paramHash по-прежнему содержит старые значения («a», «b»).
Я пробовал различные способы очистки объекта ParamHash, такие как установка его элементов и длины на нуль, появление элементов из массива. Ничто, казалось, не работать, пока я не использовал следующим образом (в функции doSomething()
):
this.paramHash.items = new Array();
this.paramHash.length = 0;
Это кажется неправильным, потому что, если у меня было много переменных-членов ... бы я должен сбросить каждый из них в отдельности? Итак, вопрос в следующем: Каков наилучший способ сбросить объект ParamHash
в исходное состояние? Я уверен, что есть более чистый/более прямой путь. Что-то вроде:
// Doesn't work! :-(
this.paramHash = new function() {};
EDIT: Я ищу для кросса-браузерным решения - тот, который работает по крайней мере в IE6 + и FF 2+.
Решение: Благодаря Cristoph, я был в состоянии сделать это путем создания отдельной переменной/свойства в пределах MyUtils
, который только держит экземпляр функции ParamHash
.
function MyUtils()
{
// Same ol' stuff.
var myParamHash;
}
// First call - works fine.
var utils = new MyUtils();
utils.myParamHash = new utils.ParamHash("a", 1, "b", 2);
utils.doSomething();
// Consequent call - works fine now.
utils.myParamHash = new utils.ParamHash("c", 3);
utils.doSomething();
Я добавил более простое решение для моего ответа; не знаю, какую проблему вы пытаетесь решить, поэтому ваш код может быть лучше подходит ... – Christoph