2011-04-28 73 views
0

我正在寫一個JavaScript(使用jQuery)的顯示類,可能會在網頁加載前實例化。如果頁面還沒有準備好當構造函數被調用,該實例被添加到一個靜態instances場的類,它被重複時,在頁面加載了:JSLint編寫構造函數,引用靜態變量

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的運行它,我得到這個錯誤:

Problem at line 25 character 9: 'MemDislay' is not defined.

MemDislay.instances.push(this);

我需要在構造函數中引用MemDisplay.instances,但構造函數是其中MemDisplay定義,所以我很困惑如何使這項工作,而JSLint的的指導方針內裝修。有一個更好的方法嗎?在這種情況下,我應該忽略JSLint嗎?

回答

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

我不知道是否有做一個漂亮的方式,因爲在整個地方有'原型'感覺有點過分,另一方面它可能是一件好事,因爲它表明prototype.field不屬於該實例。

+0

順便說一句,嘗試在JavaScript中做類繼承等事情,並且不得不手工完成所有工作,這讓我更加了解Java這樣的語言必須進行的工作,因爲這樣做符合標準 - 絕對是一種有用的學習體驗。 – 2011-04-29 01:17:45

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 

這需要一點reorgansiation的是什麼,但在前面聲明的值,可以讓JSLint開心。

+0

我不認爲這真的回答了這個問題。我很好地聲明瞭類(因爲在每個MyClass對象中都會創建一個新的MyMethod函數,而不是重新使用這個函數),所以您在那裏做的效率低於使用原型的效率。我詢問有一個與MyClass關聯的靜態字段,不會像param1那樣與MyClass的任何單個實例關聯。 – 2011-04-29 00:56:00

+0

爲鏈接到JSFiddle +1,方便的小工具。 – 2011-04-29 01:20:35