Ste*_*Fan 24 javascript oop anonymous-function javascript-objects ecmascript-6
在ES6中我们可以做匿名类:
var entity = class {
}
Run Code Online (Sandbox Code Playgroud)
但我们也可以实例化它:
var entity = new class {
constructor(name) { this.name = name; }
getName() { return this.name; }
}('Foo');
console.log(entity.getName()); // Foo
Run Code Online (Sandbox Code Playgroud)
背后做了什么,它带来了什么好处以及它带来了什么警告?
Ber*_*rgi 39
匿名类实例 - 这是一个坏主意吗?
是的,非常糟糕的一个.只是那么糟糕,因为new function() { … }在ES5.
这种写作风格导致每次评估表达式时都会创建一个新的构造函数和原型对象.如果使用这种方法创建多个对象,它们将不会获得类/原型的任何好处.
如果您希望此模式创建单个对象,那么您也会失败.构造函数仍然被创建,甚至可以访问 - 第二个实例可以轻松创建使用new entity.constructor,从而击败整个目的.
所以不要永远使用它.一个简单的对象文字更容易编写,读取和实例化:
var entity = {
name: 'Foo',
getName() { return this.name; }
};
console.log(entity.name); // Foo
Run Code Online (Sandbox Code Playgroud)
不要被new class模式很常见的其他语言所迷惑,它的工作方式与JavaScript不同.
如果你确切地知道你在做什么,你可能想要匿名类,你正在一个深思熟虑的元编程系统中创建一个类的层次结构(即你想要副本的东西),并且没有其他优雅的扩展解决方案,例如
{
myImplementation: class extends MyBaseClass {
someMethod(x) {
super().someMethod(x);
insert extended behavior
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以使用一些滥用的魔术函数来实现上述内容Object.assign:
{
myImplementation: extendMagic(mySuper => ({
someMethod(x) {
mySuper.someMethod(x);
insert extended behavior
}
}))
}
Run Code Online (Sandbox Code Playgroud)
或者找到一些更好的方法来做你正在做的事情。但是人为的用例偶尔会(尽管很少)存在。
用例从来都不是很好,但是当您需要使用原型继承更难编写的类功能时最引人注目(当然,由于类是原型继承的某种包装,您的用例归结为需要语法糖加上es6+ 类特性......你想要构造函数、super、extends 和 staticmethod 等等......还是不?你是否一直在使用已经存在的类,或者你能用对象和断言来编写所有东西吗?它真的需要吗?是匿名的?这些问题可以帮助你决定)。