我正在用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吗?
答案 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();
我不确定是否有一种更漂亮的方法可以做到这一点,因为整个地方的“原型”感觉有点过分,另一方面它可能是一件好事,因为它清楚地说明了原型。不属于实例。