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

标签 javascript oop ecmascript-6 es6-class anonymous-class

在 ES6 中我们可以做匿名类:

var entity = class {
}

但我们也可以立即实例化它:

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

它背后做了什么,它会带来什么好处,也会带来什么注意事项?

最佳答案

Immediately instantiated anonymous class — is it a bad idea?

是的,非常糟糕。只是as bad as new function() { … } was in ES5 .

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

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

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

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

不要被常见 new class 模式的其他语言所愚弄,它的工作方式与 JavaScript 中非常不同。

关于javascript - 匿名类实例——这是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739499/

相关文章:

javascript - 如果我使用两个 "if"语句而不是仅使用一个 "if/else"语句,为什么二进制搜索算法不起作用?

javascript - Angular2 中对 SystemJS 的需求是什么?

python - __getattr__ 在实现 __setattr__ 时抛出最大递归错误

javascript - AngularJS无法读取未定义的属性 'releasesList'

javascript - 通过使用源对象数组中的属性按特定顺序进行分组来形成数组

ecmascript-6 - 带箭头功能的 ES6 getter/setter

javascript - 有没有办法隐藏JavaScript代码

javascript - 为什么创建数组时需要 "new"关键字?

java - 如何根据给定的主题类型初始化复杂对象模型的属性?

php - 如何获取一个类的所有公共(public)属性作为json?