-1

我在 JS 中有一个带字段的类

Widget = function ()
{
    this.Attributes = []; // key=value
}

和另一个继承自的类Widget

BusinessStatisticWidget = function ()
{
  // some code
};

BusinessStatisticWidget.prototype = new Widget();

在初始化阶段,我已经为这个 Attributes 字段分配了值(仅一次),并且在某些时候 Atttibutes 字段变为空:

BusinessStatisticWidget.prototype.SetEventsOnControls = function ()
{
    var dropDown = document.getElementById(this.DropDownName + this.type + "Id");

    var _this = this; // **Not empty here**
    dropDown.addEventListener("change", function (event)
    {
            // **Not empty even here**
        _this.CalculateAndSetTimeRangeForTimeSpan(event.target.value);
    }, false);
}
BusinessStatisticWidget.prototype.CalculateAndSetTimeRangeForTimeSpan = function (val)
{

// **Empty here**
    if (this.Attributes["fromDate"].value != '' && this.Attributes["toDate"].value != '')
    {}
}

上面的代码在 Chrome 和 IE10 中运行良好(我的意思是数组不为空)但在 Firefox(20.0.1)中不起作用

由于数组是空的,我得到TypeError: this.Attributes.fromDate is undefined. 而且我不知道它为什么是空的以及如何解决这个问题。

4

1 回答 1

1

您的代码存在多个问题:

  1. 不要将数组用于任意键值对。仅对数组使用数字键。
  2. 每个实例将共享同一个Attributes数组。这通常不是期望的行为。

解决方案:

  1. 改用一个对象。
  2. 正确设置继承并在子构造函数中调用父构造函数。

代码:

Widget = function () {
    this.Attributes = {}; // use an pbject
};


var BusinessStatisticWidget = function () {
  // call parent constructor
  Widget.call(this);
  // some code
};

// set up inheritance
BusinessStatisticWidget.prototype = Object.create(Widget.prototype);

有关Object.create.


现在,我不知道这是否能解决您的问题,但它至少使您的代码更正确,以便更容易找到问题。我建议学习如何调试JavaScript

于 2013-04-30T12:25:33.433 回答