我有一个 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 构造函数的后续调用会引发错误“对象不支持此操作”。在这个阶段,我可以看到 utils.paramHash 对象仍然包含旧值(“a”、“b”)。
我尝试了各种方法来清除 ParamHash 对象,例如将其项目和长度设置为 null,从数组中弹出项目。doSomething()
在我使用以下方式(在函数中)之前,似乎没有任何效果:
this.paramHash.items = new Array();
this.paramHash.length = 0;
这似乎是错误的,因为如果我有很多成员变量怎么办......我必须单独重置每个变量吗?所以,问题是:将对象重置为ParamHash
初始状态的最佳方法是什么?我肯定希望有一种更清洁/更直接的方式。就像是 :
// Doesn't work! :-(
this.paramHash = new function() {};
编辑:我正在寻找一种跨浏览器的解决方案——至少在 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();