我有一个包含一些函数和成员对象的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
函数的实例。 / p>
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();
答案 0 :(得分:3)
此
utils.ParamHash = new utils.ParamHash("a", 1, "b", 2);
使用实例对象覆盖保存ParamHash()
构造函数的属性。您可以通过
utils.ParamHash.constructor
但更简洁的方法是不首先覆盖它并使用单独的属性来保存实例。
我不知道Cerebrus试图解决的确切问题,所以可能有正当理由说明他正在做什么。但在我看来,他的解决方案过于复杂。我会做这样的事情:
function MyUtils() {
this.x = getComplexData();
this.y = doSomeInitialization();
this.params = {};
}
MyUtils.prototype.doSomething = function() {
for(var prop in this.params) {
if(this.params.hasOwnProperty(prop)) {
// do stuff
}
}
};
var utils = new MyUtils;
utils.params = { a : 1, b : 2 };
utils.doSomething();
如果您确定没有人与hasOwnProperty()
混淆,则无需检查Object.prototype
。
其他一些评论:
items
不应该是数组,而是普通对象,即this.items = {};
答案 1 :(得分:2)
当你这样做时
utils.ParamHash = new utils.ParamHash("a", 1, "b", 2);
您用对象实例替换了ParamHash构造函数。后续new ParamHash()
失败,因为utils.ParamHash不再是构造函数。
试试这个:
var utils = new MyUtils();
utils.paramHashInstance = new utils.ParamHash("a", 1, "b", 2);
utils.DoSomething();
答案 2 :(得分:0)
您是否尝试省略新关键字?
utils.ParamHash = utils.ParamHash("c", 3);