JSLint пишущие конструкторы, которые ссылаются на статические переменные - PullRequest
0 голосов
/ 28 апреля 2011

Я пишу класс отображения в 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 ]

1 голос
/ 29 апреля 2011

Мой мозг, должно быть, понял это, пока я спал: хитрость заключается в том, чтобы прикрепить поле к прототипу, что кажется довольно очевидным сейчас, когда я об этом подумал, поскольку это то, что вы должны сделать, чтобы определить методы класса.

Следующее проверяется в 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 не принадлежит экземпляру.

1 голос
/ 28 апреля 2011

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 счастливым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...