Object.create用构造函数创建一个对象

时间:2014-10-24 10:02:50

标签: javascript oop

我正在学习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中使用构造函数(可能还有其他成员)编写对象?

1 个答案:

答案 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
相关问题