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

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


var entity = class {

}

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


var entity = new class {

    constructor(name) { this.name = name; }

    getName() { return this.name; }

}('Foo');

console.log(entity.getName()); // Foo

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


Helenr
浏览 305回答 3
3回答

忽然笑

如果您确切地知道自己在做什么,并且正在精心设计的元编程系统中创建类的层次结构(即您想要复制的事物),那么就可能需要匿名类,并且没有其他优雅的扩展解决方案,例如{    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        }    }))}或找到一些更好的方式来做自己在做的事情。但是人为的用例偶尔会(尽管很少)存在。用例从来都不是很好,但是当您需要难以通过原型继承编写的Class功能时,这些用例最引人注目(当然,由于Class是围绕原型继承的包装器,因此您的使用案例归结为想要语法糖加es6 +类的功能...是否需要构造函数,super和extends和staticmethod等...?是否坚持使用已经存在的类,还是可以使用Objects和asserts编写所有内容?是匿名的?这些问题可以帮助你决定)。

蓝山帝景

读者应注意以下引号:“这种书写方式会导致每次对表达式求值时都会创建一个新的构造函数和原型对象。如果使用这种方法创建多个对象,它们将不会获得类/原型的任何好处。” -除非我误解了,否则这是为每个对象创建一个匿名类的有效反对,但不一定是使用匿名类创建多个对象的反对,在这种情况下,它们仍将受益于原型继承。(其他反对意见可能存在,也可能不存在。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript