我正在尝试学习在 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);
最佳答案
您需要将 piece
函数用作构造函数——换句话说,使用 new
关键字调用它。
就目前而言,函数内部的 this
是全局对象。基本上,您不是在创建新对象并向其添加属性,而是在用垃圾破坏 gobal 对象。
由于您处于严格模式,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
重命名为以大写字母开头,因为按照惯例构造函数应该如此。
此外,假设像这样的构造函数确实是您想要的,与 Ian 的回答相比,您应该考虑将 movePiece
函数移到函数的原型(prototype)中,这样函数就不必每次创建新作品时都会重新创建。所以这个
this.movePiece = movePiece;
function movePiece(x, y) {
//...
}
会变成这样
//this goes **outside** of your function
Piece.prototype.movePiece = function movePiece(x, y) {
//...
}
关于javascript - JSLint 严格违规。面向对象的 Javascript 挫折,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979678/