一尘不染

匿名类实例-这是个坏主意吗?

javascript

在ES6中,我们可以进行匿名类:

var entity = class {
}

但是我们也可以实例化它:

var entity = new class {
    constructor(name) { this.name = name; }
    getName() { return this.name; }
}('Foo');
console.log(entity.getName()); // Foo

它背后的工作是什么,它将带来什么优势以及它也会带来什么警告?


阅读 215

收藏
2020-05-01

共1个答案

一尘不染

匿名类实例-这是一个坏主意吗?

每次评估表达式时,这种书写风格都会导致创建新的构造函数和原型对象。如果使用这种方法创建多个对象,则它们将不会获得类/原型的任何好处。

如果您打算使用此模式创建单例对象,那么您也会失败。构造函数仍然可以创建,甚至可以访问-使用可以轻松创建第二个实例new entity.constructor,从而破坏了整个目的。

所以 永远不要使用它 。一个简单的对象文字更容易编写,读取和实例化:

var entity = {
    name: 'Foo',
    getName() { return this.name; }
};
console.log(entity.name); // Foo

不要被这种new class模式很常见的其他语言所欺骗,它与JavaScript的工作方式大不相同。

2020-05-01