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

时间:2016-08-03 09:21:15

标签: javascript oop ecmascript-6 javascript-objects anonymous-function

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

setUp()

但我们也可以实例化它:

var entity = class {
}

它背后做了什么,它带来了什么好处以及它带来了什么警告?

2 个答案:

答案 0 :(得分:35)

  

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

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

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

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

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

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

不要被new class模式很常见的其他语言所迷惑,它的效果与JavaScript不同。

答案 1 :(得分:3)

如果您确切地知道自己正在做什么,那么您可能需要匿名课程,您需要在经过深思熟虑的元编程系统中创建类的层次结构(即您想要复制的内容),并且&& #39;没有其他优雅的扩展解决方案,例如

{
    myImplementation: class extends MyBaseClass {
        someMethod(x) {
            super().someMethod(x);
            insert extended behavior
        }
    }
}

当然,你可以使用Object.assign

的一些滥用魔法函数来实现上述功能
{
    myImplementation: extendMagic(mySuper => ({
        someMethod(x) {
            mySuper.someMethod(x);
            insert extended behavior
        }
    }))
}

或者找一些更好的方法去做你正在做的事情。但偶尔(尽管很少)存在人为的用例。