3

JavaScript でオブジェクト指向プログラミングを行う方法を学び、JSLint の厳密な違反を取得しようとしています。これを非グローバルなコンテキストで使用していることは理解していますが (またはそのような意味で...)、適切に使用する方法がわかりません。これが私のコードです:

function piece(color, type, x, y, captured, hasMoved) {
    "use strict";
    this.color = color;
    this.type = type;
    this.x = x;
    this.y = y;
    this.captured = captured;
    this.hasMoved = hasMoved;

    this.movePiece = movePiece;
    function movePiece(x, y) {
        // if(isLegal(x, y, this.type){
            // this.x  =  x;
            // this.y  =  y;
        // }
         alert("you moved me!");
    }
}

var whitePawn1  =  piece("white", "pawn", 0, 1, false, false);
var blackBishop1  =  piece("black", "bishop", 8, 3, false, false);
4

4 に答える 4

6

piece関数をコンストラクターとして使用する必要があります。つまり、newキーワードを使用して関数を呼び出します。

現在のところ、this関数の内部はグローバル オブジェクトです。基本的に、新しいオブジェクトを作成してそれにプロパティを追加する代わりに、グローバル オブジェクトをジャンクで破壊します。

あなたは厳密モードにthisいるので、未定義になるので、コードはエラーになります。

これはあなたが望むものです:

function Piece(color, type, x, y, captured, hasMoved) {
    "use strict";
    this.color = color;
    this.type = type;
    //...

var whitePawn1  = new Piece("white", "pawn", 0, 1, false, false);
var blackBishop1  = new Piece("black", "bishop", 8, 3, false, false);

piece慣例によりコンストラクター関数が想定されているため、大文字で始まるように名前を変更したことに注意してください。


また、このようなコンストラクター関数が本当に必要なものであると仮定すると、イアンの答えと比較しmovePieceて、関数を関数のプロトタイプに移動することを検討する必要があります。新しい作品。したがって、この

this.movePiece = movePiece;
function movePiece(x, y) {
   //...
}

これになるだろう

//this goes **outside** of your function
Piece.prototype.movePiece = function movePiece(x, y) {
       //...
}
于 2013-04-12T19:47:44.923 に答える
0

newコンストラクターを呼び出す前にキーワードがありません。コードは次のようになります。

var whitePawn1    = new piece("white", "pawn", 0, 1, false, false);
var blackBishop1  = new piece("black", "bishop", 8, 3, false, false);

また、あなたの場合、大文字でコンストラクターに名前を付けるのは良いパターンですPiece

説明:newコンストラクターがないと、呼び出された環境が破損する可能性があります。はnew新しい環境を作成し、それをコンストラクターにバインドします。

于 2013-04-12T19:50:34.897 に答える