当前位置: 首页 > 知识库问答 >
问题:

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

澹台臻
2023-03-14

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

var entity = class {
}

但我们也可以将其实例化:

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

它背后做了什么,它会带来什么优势,也会带来什么警告?

共有2个答案

年健
2023-03-14

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

{
    myImplementation: class extends MyBaseClass {
        someMethod(x) {
            super().someMethod(x);
            insert extended behavior
        }
    }
}

当然,您可以通过使用对象的一些滥用魔法函数来实现上述功能。分配

{
    myImplementation: extendMagic(mySuper => ({
        someMethod(x) {
            mySuper.someMethod(x);
            insert extended behavior
        }
    }))
}

或者找到更好的方法来做你正在做的事情。但是人为的用例偶尔(尽管很少)会存在。

用例从来都不是很好,但是当你需要用原型继承很难编写的类特性时,用例是最引人注目的(当然,因为类是原型继承的包装器,你的用例归结为想要语法糖和es6类特性...你想要构造函数、超级、扩展和静态方法等...还是不?你是坚持使用已经存在的类,还是可以使用对象和断言编写所有东西?真的需要匿名吗?这些问题可能会帮助你做出决定。)。

林博厚
2023-03-14

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

是的,非常糟糕。就像ES5中的newfunction(){…}一样糟糕。

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

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

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

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

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

 类似资料:
  • 问题内容: 在ES6中,我们可以进行匿名类: 但是我们也可以实例化它: 它背后的工作是什么,它将带来什么优势以及它也会带来什么警告? 问题答案: 匿名类实例-这是一个坏主意吗? 每次评估表达式时,这种书写风格都会导致创建新的构造函数和原型对象。如果使用这种方法创建多个对象,则它们将不会获得类/原型的任何好处。 如果您打算使用此模式创建单例对象,那么您也会失败。构造函数仍然可以创建,甚至可以访问-使

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定

  • 问题内容: 似乎我在某处听到/读到了a的内部禁忌。并不是说它不起作用,只是基于它们的显示类型,关于它们的兼容性不佳。找不到任何证据来支持我的预感,所以我可能完全错了。 问题答案: 使用实例a 并不比使用表进行布局的任何其他方式差。(尽管有些人从不使用表格进行布局,而我恰好是其中之一。) 如果您使用的,你会得到但在一种情况,它可能是很难预测的因素将如何调整大小。div的默认值是从其父对象确定其宽度,

  • 问题内容: 这是一个例子 这仅仅是匿名内部类的变体,还是完全其他? 问题答案: 是的,这是一个匿名内部类

  • 在以下片段中: 有没有办法从内部匿名类引用匿名类的外部实例? 第二个错误是在解决方案上,我在这里找到了一个匿名内部类的外部类的关键字。这些问题似乎共享一些概念和问题空间,但性质不同。

  • 我正在考虑写一些代码,可以归结为以下几点是一种集合类型(当前为,如果有必要的话)。 我的问题是,像这样把复制到是不是一个坏主意?糟糕的风格?可能会惹恼某个学究?根据类型的细微细节是否可能中断? 我不希望在这个循环运行时被破坏,也不希望任何元素被添加或删除。 一方面,我对迭代器的了解表明,这应该是完全安全的。但另一方面,我对迭代器有些不了解,这感觉有点粗略,所以我想问一下。 增编: 出现这种情况的另