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

Javascript 匿名类实例——这是个坏主意吗?,javascript,oop,ecmascript-6,javascript-objects,anonymous-function,Javascript,Oop,Ecmascript 6,Javascript Objects,Anonymous Function,在ES6中,我们可以执行匿名类: var entity = class { } 但我们也可以将其实例化: var entity = new class { constructor(name) { this.name = name; } getName() { return this.name; } }('Foo'); console.log(entity.getName()); // Foo 它背后做了什么,会带来什么好处,也会带来什么警告 匿名类实例-这是个坏主意吗 是的,

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

var entity = class {
}
但我们也可以将其实例化:

var entity = new class {
    constructor(name) { this.name = name; }
    getName() { return this.name; }
}('Foo');
console.log(entity.getName()); // Foo
它背后做了什么,会带来什么好处,也会带来什么警告

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

是的,非常糟糕。只是

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

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

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

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

不要被其他语言愚弄,
新类
模式很常见,它的工作原理与JavaScript非常不同。

如果您确切知道自己在做什么,您可能需要匿名类,您正在一个经过深思熟虑的元编程系统中创建类的层次结构(即,您想要复制的东西),对于扩展,没有其他优雅的解决方案,例如

{
    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
        }
    }))
}
或者找到更好的方法来做你正在做的事情。但是人为的用例偶尔(尽管很少)会存在


用例从来都不是很好,但是当您需要使用原型继承更难编写的类特性时,用例最引人注目(当然,由于类是围绕原型继承的包装,您的用例可以归结为需要语法糖加上es6+类功能……您是否需要构造函数、super、extends和staticmethod等……还是不需要?您是否一直在使用已经存在的类,还是可以使用对象和方法编写所有内容断言?它真的需要匿名吗?这些问题可能会帮助您做出决定。)为什么不使用对象文字?还是实际的构造函数?个人的味道;我喜欢C++和java风格的对象声明。我认为这和普通原型创建之间没有什么不同。只是语法差异。看起来这个博客条目足够好,与我的问题有关:ES5有匿名。构造函数也是:
entity=new function(name){this.name=name}(“Foo”)
class
只是构造函数和一些额外的语法糖。因此,当存在匿名构造函数时,也会存在匿名类。读者应该注意引号“这种写作风格导致每次计算表达式时都会创建一个新的构造函数和原型对象。如果使用这种方法创建多个对象,它们将不会获得类/原型的任何好处。“--除非我误解了,否则这是对为每个对象创建匿名类的有效反对,但不一定是对使用匿名类创建多个对象的反对,在这种情况下,它们仍将受益于原型继承(其他反对可能存在,也可能不存在)@ninjagecko是的,反对对“单身”使用
class
。这甚至不需要匿名。如果你对单身使用这个,你就没有“失败”。您可以通过简单地克隆任何对象来创建其第二个实例。JavaScript是一种动态语言,具有内省、eval和可在运行时修改的标准库。如果您希望从恶意或愚蠢的同事那里锁定代码,那么您肯定选错了编程语言!@alextgordon Objects闭包的使用不容易克隆,如果单例的设置逻辑不包含在(构造函数)方法中,则通常不能运行两次。您没有提供任何明确的参数来反对使用匿名类。类/原型的好处是什么?使用匿名类时,单例的设置逻辑到底有什么不具备的“每次评估时创建一个类”,这完全取决于在程序过程中发生的频率(多少次)。在某些情况下,负面影响可以忽略不计。但作为一般规则,是的,我建议坚持使用普通类。除非你有理由不这样做。