【问题标题】:Correct way to reset or clear a Javascript object?重置或清除 Javascript 对象的正确方法?
【发布时间】:2009-02-26 17:42:39
【问题描述】:

我有一个 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 对象,例如将其项目和长度设置为空,从数组中弹出项目。在我使用以下方式(在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();

【问题讨论】:

  • 我为我的答案添加了一个更简单的解决方案;不知道您要解决什么问题,因此您的代码可能更适合...

标签: javascript function object reset


【解决方案1】:

这个

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();

如果您可以确定没有人弄乱Object.prototype,则无需检查hasOwnProperty()。


一些额外的cmets:

  • 在 JavaScript 中,通常只有构造函数的名称大写
  • items 不应该是一个数组,而是一个普通的对象,即this.items = {};

【讨论】:

  • 您能否提供一个示例,说明如何使用检索到的构造函数(使用构造函数属性)来重置对象?
  • utils.ParamHash = utils.ParamHash.constructor 将撤消分配,即之后您可以通过utils.ParamHash = new utils.ParamHash("c", 3, "d", 4)分配新值
  • 谢谢。我已经编辑了我的问题以包含我使用的最终解决方案。
【解决方案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();

【讨论】:

  • 谢谢,切坦。这不会引发错误,但是实例或参数在作为类的一部分的 DoSomething() 函数中不可用。我需要在 DoSomething() 函数中进行重置。
  • @Cerebrus:为什么实例不可用? for (var i in this.paramHashInstance.items) 应该可以正常工作...
  • 因为我忽略了在 MyUtils 类中创建属性。正如@Chetan 的回答似乎暗示的那样,我正在动态添加该属性。请参阅我编辑的问题。
【解决方案3】:

您是否尝试过省略 new 关键字?

utils.ParamHash = utils.ParamHash("c", 3);

【讨论】:

  • 我有,尽管如果这样我会感到惊讶。它显示“预期功能”。 :-(
  • 如果省略 new 关键字,则不会创建新对象。它只是在全局上下文中运行构造函数(将所有属性设置为窗口对象)!
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多