javascript - JSLint 严格违规。面向对象的 Javascript 挫折

标签 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.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/

相关文章:

twitter-bootstrap - 在构建 Twitter Bootstrap 时让 jshint 忽略某些文件

php - 如果我声明空白页(strict_types=1);在文件顶部的 PHP 7 中

javascript - 严格模式下获取当前函数名

css - 粘性页脚、页眉和 100% 高度内容

javascript - 复选框的行为类似于单选框 javascript

javascript - 列表对象 ID 值与对话框模式属性绑定(bind)

javascript - JSLint 提示我的 try/catch

javascript - 如何使用 JSLint 只扫描 eval 错误?

javascript - 将 XML 转换为字符串并附加到页面

javascript - 如何清除 Inquirer.js 中的错误输入