如何在调用此类的构造函数时创建ES6类的对象数组?

时间:2018-08-19 10:55:46

标签: javascript class oop ecmascript-6

我想在调用类的构造函数时创建对象的数组或对象吗?我的意思是,每次调用类构造函数时,它都会向数组或对象添加新对象。

f.e。

let blocks = {};

class Block(){

    constructor(X,Y,width,height){
        this.X = X;
        this.Y = Y;
        ...
        and now I would like to add this created object to "blocks"
        something like: blocks.push(and this object here)
    }
}

我如何实现这样的功能?还是应该使用其他功能?

2 个答案:

答案 0 :(得分:3)

  

类似的东西:blocks.push(和这个对象在这里)

这就是您要做的事情,但是blocks应该是数组,而不是对象。所以:

let blocks = [];

,然后在构造函数中:

blocks.push(this);

实时示例:

let blocks = []; // <== [], not {}

class Block {    // No ()

    constructor(X,Y,width,height){
        this.X = X;
        this.Y = Y;
        blocks.push(this);
    }
}

new Block(1, 1, 1, 1);
new Block(2, 2, 2, 2);
new Block(3, 3, 3, 3);

console.log(blocks.length); // 3

但是,请注意,这意味着对象(创建的块)将始终保留在内存中,即使最初创建并完成的任何对象都可以保留。通常,您不会让构造函数执行类似的操作,而是将其留给调用方。

根据构建此阻止列表的原因,您可能(也可能不)希望使用WeakSetWeakMap

答案 1 :(得分:0)

您不能使用push方法,因为该方法不存在于对象中。当前,您通过以下方式创建了对象:

let blocks = [];  // creates object with literal syntax.

push是仅在数组上可用的方法:

let obj = {};
let arr = [];

console.log(typeof obj.push );  // push not on obj
console.log(typeof arr.push );  // push is on array.prototype

您可以通过从对象文字更改为数组文字来解决它。

let blocks = []; 

class Block {    

    constructor(X,Y,width,height){
        this.X = X;
        this.Y = Y;
        blocks.push(this);
    }
}

new Block(1, 2, 3, 4);
new Block(2, 4, 6, 8);

console.log(blocks); // 3