0

我正在用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(this);

我需要MemDisplay.instances在构造函数中引用,但是构造函数是在哪里MemDisplay定义的,所以我很困惑如何在符合 JSLint 准则的同时使其工作。有一个更好的方法吗?在这种情况下我应该忽略 JSLint 吗?

4

2 回答 2

1

这里的 JSLint 实际上是在强调代码的一个更广泛的问题,而没有这么说。

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

我已经创建了一个非常简单的等价于你想要实现的东西(也在这个 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 满意。

于 2011-04-28T19:32:35.627 回答
1

我的大脑在我睡觉的时候一定已经想到了这一点:诀窍是将字段附加到原型上,现在我已经想到了这一点,这似乎很明显,因为这是定义类方法所必须做的。

以下检查在 JSLint 中,并演示了 MyClass 的所有实例之间的字段共享(或在 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();

我不确定是否有更漂亮的方法来做到这一点,因为到处都有“原型”感觉有点过分,另一方面,这可能是一件好事,因为它清楚地表明prototype.field 不属于到实例。

于 2011-04-29T01:14:43.503 回答