2011-04-28 2 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를 통해이를 실행 이 오류 얻을 : 내가 생성자에서 MemDisplay.instances을 참조 할 필요가

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

MemDislay.instances.push(this);

을하지만, 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에서 클래스 상속과 같은 일을하려고 할 때 수동으로 모든 작업을 수행해야하는 경우 자바를 표준으로 사용하는 언어 (특히 유용한 학습 경험)에서 진행되어야하는 작업에 대해 큰 감사를 표합니다. –

1

여기서 JSLint는 실제로 코드에 대한 더 광범위한 문제를 강조하지 않고 강조하고 있습니다.

클래스 (MemDisplay)를 참조하고 있지만 개체로 인스턴스화하지 않았습니다. 나는. 당신은 이미 인스턴스화 된 객체처럼 클래스를 다루고 있습니다. 나는, 그러나 정면 값을 수행 할 수 있습니다 선언이

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 조금 걸릴거야 (this JSFiddle에서도) 달성하려고하는 것에 매우 간단한 상당을 만들었습니다

JSLint를 행복하게 만드십시오.

+0

저는 이것이 정말로 그 질문에 대답하지 않았다고 생각합니다. 나는 클래스를 선언하는 것으로 괜찮습니다. 프로토 타입을 사용하는 것보다 효율적이지 않습니다. 하나의 함수를 다시 사용하기보다는 모든 MyClass 객체에 대해 새로운 MyMethod 함수가 만들어지기 때문에 프로토 타입을 사용하는 것보다 효율적이지 않습니다. param1이 될 MyClass의 개별 인스턴스와 관련이없는 MyClass와 연관된 정적 필드를 갖는 것에 대해 묻습니다. –

+0

+1 JSFiddle에 대한 링크를 위해, 거기에 편리한 작은 도구. –