创建新 class 与使用 export const 之间的区别
Differences between creating a new class to using export const
设置:
- BabelJS (es2015, react, stage-1)
- Webpack
- React/redux
CommonJS 和 ES6 的新手。我知道对象实例和方法的静态容器之间的区别,但我不确定它们在分离到模块时的行为方式。所以我想知道返回实例之间有什么区别(这种模式是否有效?):
// StateParser.js
class StateParser {
constructor() {
}
method1() {
...
}
}
export default new StateParser()
并导出 const 方法:
// StateParser.js
let state = {
}
export const method1 = () => { ... }
- 方法A:每次导入都会有新实例吗?
方法 B:使用对象解构的好处之一:
import { method1 } from '../utils/StateParser.js';
然后像本地存在的方法1一样使用?
方法A:好处之一是能够在构造函数中初始化状态吗?
所以基本上我不确定什么时候为我的实用程序使用哪个 类,非常感谢您的意见。
Would there be a new instance every time I import A?
不,模块只评估一次。
Is one of the benefits of B the ability to use object destructuring and then use method1 as if it existed locally?
是的,虽然它不叫 "destructuring"。它们是 named imports(或模块的 named exports),它们不嵌套并使用不同的别名语法。
Is one of the benefits of A the ability to initialize state in the constructor?
没有。您也可以直接在模块范围内初始化模块状态,不需要构造函数。
但是,是的,如果您在实例中有状态,最好使用可以 实例化多次 的 class。为此,您需要导出 class 本身,当然不是实例。
Is the export default new …
pattern valid at all?
不,由于上述原因,它是一种反模式。鉴于 class 没有在其他任何地方使用,它与 antipattern. And exporting multiple named exports 非常相似,而不是默认导出对象。
We don't recommend 出于多种原因导出评估(例如 new StateParser()
)。
在这种情况下,模块导出只评估一次的结果(@Bergi 也提到)。这很少是期望的结果,但如果是,则应改用单例模式。失去了一些 ES6 模块的好处(tree-shaking and faster access to imports),它使导入速度变慢并可能导致副作用,而这些副作用应该在调用时发生。我也认为这是一种反模式,可以通过导出函数或 class.
来避免缺点
将 export default StateParser
与导出 const 方法进行比较更有意义。
另请参阅:
- All exports are static
- Lost ES6 benefits
设置:
- BabelJS (es2015, react, stage-1)
- Webpack
- React/redux
CommonJS 和 ES6 的新手。我知道对象实例和方法的静态容器之间的区别,但我不确定它们在分离到模块时的行为方式。所以我想知道返回实例之间有什么区别(这种模式是否有效?):
// StateParser.js
class StateParser {
constructor() {
}
method1() {
...
}
}
export default new StateParser()
并导出 const 方法:
// StateParser.js
let state = {
}
export const method1 = () => { ... }
- 方法A:每次导入都会有新实例吗?
方法 B:使用对象解构的好处之一:
import { method1 } from '../utils/StateParser.js';
然后像本地存在的方法1一样使用?
方法A:好处之一是能够在构造函数中初始化状态吗?
所以基本上我不确定什么时候为我的实用程序使用哪个 类,非常感谢您的意见。
Would there be a new instance every time I import A?
不,模块只评估一次。
Is one of the benefits of B the ability to use object destructuring and then use method1 as if it existed locally?
是的,虽然它不叫 "destructuring"。它们是 named imports(或模块的 named exports),它们不嵌套并使用不同的别名语法。
Is one of the benefits of A the ability to initialize state in the constructor?
没有。您也可以直接在模块范围内初始化模块状态,不需要构造函数。
但是,是的,如果您在实例中有状态,最好使用可以 实例化多次 的 class。为此,您需要导出 class 本身,当然不是实例。
Is the
export default new …
pattern valid at all?
不,由于上述原因,它是一种反模式。鉴于 class 没有在其他任何地方使用,它与
We don't recommend 出于多种原因导出评估(例如 new StateParser()
)。
在这种情况下,模块导出只评估一次的结果(@Bergi 也提到)。这很少是期望的结果,但如果是,则应改用单例模式。失去了一些 ES6 模块的好处(tree-shaking and faster access to imports),它使导入速度变慢并可能导致副作用,而这些副作用应该在调用时发生。我也认为这是一种反模式,可以通过导出函数或 class.
来避免缺点将 export default StateParser
与导出 const 方法进行比较更有意义。
另请参阅:
- All exports are static
- Lost ES6 benefits