2013-04-12 5 views
3

JavaScript에서 객체 지향 프로그래밍을 배우고 JSLint가 엄격한 위반을하는 것을 배우려고합니다. 나는 이것을 non-global 맥락에서 (또는 그 효과에 ...) 사용하고 있음을 이해한다. 그러나 나는 그것을 올바르게하는 방법을 모른다.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); 
+3

특정 jslint 메시지는 무엇입니까? –

답변

6

당신은 생성자에서 다른 단어는 new 키워드를 부르는로 piece 기능을 사용할 필요가 : 여기 내 코드입니다.

현재 함수의 내부에있는 this은 전역 개체입니다. 기본적으로 새 객체를 만들고 속성을 추가하는 대신에 gobal 객체를 정크로 clobbering합니다.

엄격 모드이므로 this은 정의되지 않으므로 코드가 오류가 발생합니다. 나는 관례 생성자 함수가에 가정되기 때문에, 대문자로 시작하는 piece 이름을 변경

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

참고 :

이 당신이 원하는합니다. 이 같은 생성자 함수를 가정 또한


, 당신은 이안의 대답에 비해 원하는 정말, 당신은 함수의 프로토 타입에 movePiece 기능을 이동하는 것을 고려한다 그 함수는 다시 할 필요가 없도록 새로운 작품을 만들 때마다 매번 만들어집니다. 그래서이

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

은 당신의 생성자를 호출하기 전에 당신은 new 키워드를 누락이

//this goes **outside** of your function 
Piece.prototype.movePiece = function movePiece(x, y) { 
     //... 
} 
+1

엄격한 모드에서 객체를 통해 함수를 호출하지 않는 한'this'는 정의되지 않았다고 생각했습니다.(즉, 더 이상 기본적으로 전역 객체가 아닙니다.) – cHao

+0

@cHao -하지만 이것은 정확하게 말하는 것입니다. * strict 모드에서 함수를 정의해야합니다. 함수 내에서 "엄격한 사용"이라고 말하면 평소와 같이 여전히 창입니다. –

+0

아, 엄격한 모드 스크립트 안에 있어야합니까? – cHao

0

이 될 것입니다. 코드는 다음과 같아야합니다

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

또한 대문자로 이름을 생성자에 좋은 후두둑 귀하의 경우 Piece

설명에서, : new없이 생성자가 불려 곳 손상 환경 않을 수 있습니다. new은 새 환경을 만들고이를 생성자에 바인딩합니다.

1

나는 내부적/기능적으로 다른 것이 얼마나 잘 모르겠지만, 당신은 사용할 수 있습니다

function piece(color, type, x, y, captured, hasMoved) { 
    "use strict"; 
    return { 
     color: color, 
     type: type, 
     x: x, 
     y: y, 
     captured: captured, 
     hasMoved: hasMoved 
    }; 
} 

var whitePawn1 = piece("white", "pawn", 0, 1, false, false); 

this 또는 new의 사용을 필요로하지 않습니다.

모든 인스턴스에 공유 속성/메소드를 적용하려면 .prototype을 사용할 수 없습니다. 그리고 반환 된 개체 초기화도 추가됩니다.

1

아 감사합니다. Adam Rackis. 그랬어. 참고로 다음은 최종 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; 
} 
Piece.prototype.movePiece = function movePiece(x, y) { 
    "use strict"; 
    /*global alert */ 
    alert("you moved me to " + x + ", " + y + "!"); 
}; 
var whitePawn1 = new Piece("white", "pawn", 0, 1, false, false); 
var blackBishop1 = new Piece("black", "bishop", 8, 3, false, false);