JSLint编写引用静态变量的构造函数

时间:2011-04-28 01:54:42

标签: constructor jslint static-variables

我正在用Javascript(使用jQuery)编写一个显示类,可以在加载网页之前对其进行实例化。如果在调用构造函数时页面未准备就绪,则会将实例添加到类的静态instances字段中,该字段在页面加载时迭代:

function MemDisplay(ready_callback) {
    this.readyCallback = ready_callback;
    if (MemDisplay.ready) {
        this.linkToPage();
    } else {
        MemDislay.instances.push(this);
    }
}

//this makes sure that the ready callback can be sent when the page has loaded
MemDisplay.ready = false;
MemDisplay.instances = [];

$(document).ready(function () {
    var i;

    MemDisplay.ready = true;
    for (i = 0; i < MemDisplay.instances.length; i += 1) {
        MemDisplay.instances[i].linkToPage();
    } });

//example truncated for brevity

当我通过JSLint运行时,我收到此错误:

  

第25行第9个问题:   “MemDislay”未定义。

     

MemDislay.instances.push(本);

我需要在构造函数中引用MemDisplay.instances,但构造函数是定义MemDisplay的地方,所以我很困惑如何在符合JSLint指南的情况下完成这项工作。有一个更好的方法吗?我应该在这个实例中忽略JSLint吗?

2 个答案:

答案 0 :(得分:1)

这里的JSLint实际上突出了代码的一个更广泛的问题而没有这么说。

您正在引用一个类(MemDisplay),但从未将其实例化为对象。即你正在把这个类视为已经实例化的对象。

我创造了一个非常简单的等同于你想要达到的目标(同样在this JSFiddle

function MyClass(p1, p2){
    this.param1 = p1;   //class member/property - use this to access internally.
    if (this.param1 === 1){ //you might want to consider doing this as part of some setter method
        alert("test");
    }
    this.MyMethod = function(){ //class method/function
        alert("MyMethod Called");
    };
}

var myObj = new MyClass(1,2); //instantiate
alert(myObj.param1); //get value of object member (you can set as well)
myObj.MyMethod(); //call a method

这需要一些重组,但通过预先声明值,你可以让JSLint高兴。

答案 1 :(得分:1)

当我睡觉的时候,我的大脑肯定已经想到了这个:诀窍是将场地附加到原型上,现在我已经想到了它,这似乎很明显,因为这是你必须要做的来定义类方法。

以下检查JSLint,并演示在MyClass的所有实例之间共享字段(或参见this code on jsfiddle):

/*global alert */

function MyClass(name) {
    this.name = name;
    MyClass.prototype.field += 1;
}

MyClass.prototype.field = 0;

MyClass.prototype.myMethod = function () {
    alert(this.name + "'s class's field is " + MyClass.prototype.field);
};

var myObj = new MyClass("first");
myObj.myMethod();

var myOtherObj = new MyClass("second");
myObj.myMethod();
myOtherObj.myMethod();

我不确定是否有一种更漂亮的方法可以做到这一点,因为整个地方的“原型”感觉有点过分,另一方面它可能是一件好事,因为它清楚地说明了原型。不属于实例。