我正在学习Javascript,我是一名C ++程序员。我尝试使用带有object.create的构造函数创建一个对象,结果如下:
var PlayGround ={
initGrid : function(N) {
this.N=N;
this.grid = new Array(N);
for (var i = 0; i < N; i++) {
this.grid[i] = new Array(N);
for (var j = 0; j < N; j++) {
this.grid[i][j] = false;
}
}
return true;
}
};
var PlayGround_property = {
N:{
value: 100,
writable:true
},
grid:{
value:null,
writable:true
}
}
var board= Object.create(PlayGround, PlayGround_property);
它按我的意愿工作:对象板包含对象网格,现在我可以使用set和get关键字来定义=和()运算符的行为。 无论如何,我已经在网上看到了
Javascript中的此
关键字不安全,我想确保它始终引用板对象而不是全局窗口对象。有没有办法,或者我正在过度思考? 还有其他问题,是否有其他方法可以在Javascript中使用构造函数(可能还有其他成员)编写对象?
答案 0 :(得分:1)
我想确定[this]总是指板对象
函数的 this 可以通过调用函数或 bind 来设置。所以请确保以正确的方式调用方法。如果您总是将函数称为 board 的方法,则方法中的 this 将始终引用 board 。
如果您只有一个 board 的实例,那么使用构造函数似乎没什么意义。如果您有多个 board 实例,那么您希望 this 引用调用该方法的特定实例,这样您就不想修复 this 使用 bind 。
Crockford不喜欢使用 new ,所以鼓励 Object.create ,这符合他对继承应该如何工作的想法。
您的模式可以重写为使用类似的构造函数:
function PlayGround (N) {
this.N = N;
this.grid = []; // Use array literal, it's less to type
for (var i = 0; i < N; i++) {
this.grid[i] = [];
for (var j = 0; j < N; j++) {
this.grid[i][j] = false; // Not sure why you bother with this
}
}
}
var board = new Playground(100);
我不确定你在做什么,但那应该很接近。请注意,javascipt是松散类型的,所以如果你有一些有用的东西可以初始化变量和属性。使用 undefined 的值创建变量,仅在实际为其分配内容时才创建数组属性,创建长度为N的数组不会创建任何索引,例如。
var arr = new Array(10);
console.log(arr.length); // 10
console.log(arr.hasOwnProperty(0)); // false