16

在ES6我们可以做匿名类:匿名类实例----这是一个坏主意吗?

var entity = class { 
} 

但是,我们也可以实例吧:

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

背后是什么做,又会带来哪些优势,哪些注意事项将它也带来了什么?

+0

为什么不只是使用对象文字?或者一个实际的构造函数? – evolutionxbox

+0

个人风味;我喜欢C++和Java风格的对象声明。 –

+0

我不认为这和普通的原型类创建有什么不同。这只是语法差异。 https://www.quora.com/Is-class-syntax-in-ECMAScript-6-just-a-syntactic-sugar-for-classical-prototypes/answer/Fionn-Kelleher-1?srid=kdJ8 – evolutionxbox

回答

21

Anonymous class instance — is it a bad idea?

是的,非常糟糕的一个。只需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。

+0

读者应该注意引用“这种写作风格导致每次评估表达式时都会创建一个新的构造函数和原型对象。如果使用这种方法创建多个对象,他们将不会获得类/原型“。 - 除非我误解,这是为每个对象创建一个匿名类的有效反对意见,但并不一定反对使用匿名类来创建多个对象,在这种情况下,它们仍会受益于原型继承。 (其他异议可能会也可能不存在。) – ninjagecko

+0

@ninjagecko是的,反对在一般情况下使用'class'作为“单身人士”。它甚至不需要匿名。 – Bergi

0

如果您确切知道自己在做什么,或者在精心设计的元编程系统中创建了类的层次结构(即您想要的副本),那么您可能需要匿名类,并且没有其他优雅解决方案扩展,例如

{ 
    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 
     } 
    })) 
} 

或找到一些更好的方式做自己在做什么。但是偶尔会有(甚至很少)存在人为的使用案例。

相关问题