0

Web ページが読み込まれる前にインスタンス化される可能性がある 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 を無視する必要がありますか?

4

2 に答える 2

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 に答える
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 に答える