javascript - Object.create 使用构造函数创建对象

标签 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 关键字来定义 = 和 () 运算符的行为。 不管怎样,我在网上读到了

this

Javascript 中的关键字不安全,我想确保它始终引用板对象而不是全局窗口对象。有什么办法还是我想太多了? 其他问题,是否有其他方法可以在 Javascript 中使用构造函数(可能还有其他成员)编写对象?

最佳答案

I want to be sure that [this] is referring always to the board object

函数的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 是松散类型的,因此只有在需要分配有用的内容时才初始化变量和属性。变量是用未定义的值创建的,只有当您实际向它们分配某些内容时才会创建数组属性,创建长度为 N 的数组不会创建任何索引,例如

var arr = new Array(10);
console.log(arr.length); // 10
console.log(arr.hasOwnProperty(0)); // false

关于javascript - Object.create 使用构造函数创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545786/

相关文章:

java - 将字符串封装为 byte[] 是为了节省内存吗? ( java )

c++ - 在 Qt 5.7 C++ 中创建简单对象

oop - 在这个简单的MVC场景中,我应该把这种逻辑放在哪里?

javascript - 如何在 Angular JS 中使用 ng-repeat 填充数组

javascript - 如何默认在列表中选择单选按钮,该按钮可能会根据 onload 依赖项以任何方式出现

javascript - jQuery 处理复选框组

visual-studio - 记录对象数据的最佳技术是什么?

c++ - 虚拟派生函数和包含循环

javascript - 使用 javascript/jQuery 重新加载样式表而不闪烁未设置样式的内容

javascript - 如何通过可视化操作图表来更新数据