匿名 class 实例 ---- 这是个坏主意吗?
Anonymous class instance ---- is it a bad idea?
在 ES6 中我们可以做匿名 class:
var entity = class {
}
但是我们也可以实例化它:
var entity = new class {
constructor(name) { this.name = name; }
getName() { return this.name; }
}('Foo');
console.log(entity.getName()); // Foo
背后做了什么,会带来什么好处,又会带来什么注意事项?
Anonymous class instance — is it a bad idea?
是的,非常糟糕。就 as bad as new function() { … }
was in ES5.
这种写作风格导致每次计算表达式时都会创建一个新的构造函数和原型对象。如果您使用这种方法创建多个对象,它们将获得 classes/prototypes 的 none 个好处。
如果您希望此模式创建单例对象,那么您也失败了。构造函数仍然被创建,甚至可以访问 - 使用 new entity.constructor
可以轻松创建第二个实例,破坏了整个目的。
所以永远不要使用它。一个简单的对象文字更容易编写、读取和实例化:
var entity = {
name: 'Foo',
getName() { return this.name; }
};
console.log(entity.name); // Foo
不要被 new class
模式常见的其他语言所愚弄,它的工作方式与 JavaScript 中的非常不同。
如果您确切地知道自己在做什么,您可能需要匿名 classes,您正在 classes 中创建一个层次结构(即您想要副本的东西) 23=] 元编程系统,并且没有其他优雅的扩展解决方案,例如
{
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
}
}))
}
或者找到一些更好的方法来完成您正在做的事情。但是人为的 use-cases 偶尔会(虽然很少)存在。
use-cases 从来都不是很好,但是当您需要 Class 功能时最引人注目,这些功能很难用原型继承编写(当然,因为 Classes 有点像围绕原型继承的包装器,您的用例归结为想要语法糖加上 es6+ class 功能......你想要构造函数和 super 以及 extends 和 staticmethod 等......还是不?你是否坚持使用 classes 已经存在,或者你可以使用对象和断言编写所有内容吗?它真的需要匿名吗?这些问题可能会帮助你做出决定。)。
在 ES6 中我们可以做匿名 class:
var entity = class {
}
但是我们也可以实例化它:
var entity = new class {
constructor(name) { this.name = name; }
getName() { return this.name; }
}('Foo');
console.log(entity.getName()); // Foo
背后做了什么,会带来什么好处,又会带来什么注意事项?
Anonymous class instance — is it a bad idea?
是的,非常糟糕。就 as bad as new function() { … }
was in ES5.
这种写作风格导致每次计算表达式时都会创建一个新的构造函数和原型对象。如果您使用这种方法创建多个对象,它们将获得 classes/prototypes 的 none 个好处。
如果您希望此模式创建单例对象,那么您也失败了。构造函数仍然被创建,甚至可以访问 - 使用 new entity.constructor
可以轻松创建第二个实例,破坏了整个目的。
所以永远不要使用它。一个简单的对象文字更容易编写、读取和实例化:
var entity = {
name: 'Foo',
getName() { return this.name; }
};
console.log(entity.name); // Foo
不要被 new class
模式常见的其他语言所愚弄,它的工作方式与 JavaScript 中的非常不同。
如果您确切地知道自己在做什么,您可能需要匿名 classes,您正在 classes 中创建一个层次结构(即您想要副本的东西) 23=] 元编程系统,并且没有其他优雅的扩展解决方案,例如
{
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
}
}))
}
或者找到一些更好的方法来完成您正在做的事情。但是人为的 use-cases 偶尔会(虽然很少)存在。
use-cases 从来都不是很好,但是当您需要 Class 功能时最引人注目,这些功能很难用原型继承编写(当然,因为 Classes 有点像围绕原型继承的包装器,您的用例归结为想要语法糖加上 es6+ class 功能......你想要构造函数和 super 以及 extends 和 staticmethod 等......还是不?你是否坚持使用 classes 已经存在,或者你可以使用对象和断言编写所有内容吗?它真的需要匿名吗?这些问题可能会帮助你做出决定。)。