JSLint严格违反了。面向对象Javascript的挫折

JSLint严格违反了。面向对象Javascript的挫折,javascript,jslint,strict,use-strict,Javascript,Jslint,Strict,Use Strict,我正在努力学习用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.

我正在努力学习用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
关键字调用它

现在,函数中的这个是全局对象。基本上,你不是在创建一个新的对象,并在其中添加属性,而是在用垃圾撞击gobal对象

由于您处于严格模式,
将未定义,因此您的代码将出错

这就是你想要的:

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
,以大写字母开头,因为按照约定,构造函数的功能应该是


同样,假设这样的构造函数是你想要的,与伊恩的答案相比,你应该考虑将<代码> MaveMeSe>代码>函数移出到函数的原型中,这样函数就不必每次创建一个新的块时重新创建。那么这个

this.movePiece = movePiece;
function movePiece(x, y) {
   //...
}
会变成这样吗

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

在调用构造函数之前,您缺少
new
关键字。代码应该如下所示:

var whitePawn1    = new piece("white", "pawn", 0, 1, false, false);
var blackBishop1  = new piece("black", "bishop", 8, 3, false, false);
在你的例子中,用大写字母命名构造函数也是一种很好的方式


说明:如果没有
new
,您的构造函数可能会损坏其在调用时所处的环境。
new
创建新环境并将其绑定到构造函数

我不确定它在内部/功能上会有什么不同,但您可以使用:

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);
它不需要使用


虽然我猜您不能使用
.prototype
将共享属性/方法应用于所有实例。而且返回的对象初始化也是额外的。

啊,谢谢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);

具体的jslint消息是什么?我认为在严格模式下,
这个
是未定义的,除非您通过对象调用函数。(即:默认情况下它不再是全局对象。)@cHao-是的,但是,我想我说得对,函数必须在严格模式下定义。如果你只是在函数内部说“使用严格”,那么这仍然是像往常一样的窗口。哦,它必须在严格模式脚本中吗?@cHao-gah,刚刚再次测试了它。我错了。更新我的答案。