JSLint严格违反了。面向对象Javascript的挫折
我正在努力学习用JavaScript进行面向对象编程,并严格遵守JSLint。我知道我是在一个非全局的环境中使用它(或类似的东西…),但我不知道如何正确地使用它。这是我的密码: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.
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,刚刚再次测试了它。我错了。更新我的答案。