Tag: ecmascript 6

在JavasScript ECMAScript 6中从string创build对象

我想使用ES6创build对象工厂,但旧式的语法不适用于新的。 我有下一个代码: export class Column {} export class Sequence {} export class Checkbox {} export class ColumnFactory { constructor() { this.specColumn = { __default: 'Column', __sequence: 'Sequence', __checkbox: 'Checkbox' }; } create(name) { let className = this.specColumn[name] ? this.specColumn[name] : this.specColumn['__default']; return new window[className](name); // this line throw error } } let factory = new […]

Javascript(ES6),导出常量与导出默认值

我试图确定这两个之间是否有任何大的差异,除了能够通过仅仅执行export default导入: import myItem from 'myItem'; 并使用export const我可以这样做: import { myItem } from 'myItem'; 我想知道是否有任何差异和/或除此之外的用例。

从目录中的文件导入模块

用es6,我可以像这样从一个文件导入多个导出: import {ThingA, ThingB, ThingC} from 'lib/things'; 不过,我喜欢每个文件都有一个模块的组织。 我最终得到像这样的import: import ThingA from 'lib/things/ThingA'; import ThingB from 'lib/things/ThingB'; import ThingC from 'lib/things/ThingC'; 我希望能够做到这一点: import {ThingA, ThingB, ThingC} from 'lib/things/*'; 或类似的东西,理解的约定,每个文件包含一个默认的导出,每个模块的命名与其文件相同。 这可能吗?

将string转换为模板string

是否有可能创build一个模板string作为一个通常的string let a="b:${b}"; 然后将其转换为模板string let b=10; console.log(a.template());//b:10 没有eval , new Function和其他dynamic代码生成手段?

ES6类variables的替代品

目前在ES5中,我们中的很多人在框架中使用以下模式来创build类和类variables,这是很舒服的: // ES 5 FrameWork.Class({ variable: 'string', variable2: true, init: function(){ }, addItem: function(){ } }); 在ES6中,你可以在本地创build类,但是没有select类variables: // ES6 class MyClass { const MY_CONST = 'string'; // <– this is not possible in ES6 constructor(){ this.MY_CONST; } } 可悲的是,上面的方法是行不通的,因为类只能包含方法。 我明白,我可以在constructor this.myVar = true …但我不想'垃圾'我的构造函数,特别是当我有一个更大的类20-30 + params。 我想了很多办法来解决这个问题,但是还没有find什么好的方法。 (例如:创build一个ClassConfig处理函数,然后传递一个parameter对象,这个parameter对象和这个类是分开声明的,然后这个处理函数将会附加到这个类上,我也想到了WeakMaps也可以用来进行整合。 你有什么样的想法来处理这种情况?

ES6中块级函数的精确语义是什么?

我试图通过阅读原始规格来围绕ES6中新的标准化块级function。 我肤浅的理解是: 在ES6中允许块级函数声明。 他们耸立在街区的顶端。 在严格模式下,它们在包含块外面不可见。 然而,由于这些语义的一部分被指定为“可选”并且仅对于web浏览器( 附录B )是强制性的,所以这变得更复杂。 所以我想填写下面的表格: | 可见的块外? | 悬挂? 到哪个点? | “TDZ”? | ————————————————– ————————————————– ——————– | 非严格模式,没有“networking扩展”| | | | | 严格的模式,没有“networking扩展”| | | | | 非严格模式,用“web extensions | | | | | 严格模式,使用“networking扩展”| | | | 而且我不清楚在这方面“严格模式”是什么意思。 这个区别似乎在附录B3.3中介绍,作为函数声明的运行时执行的一些附加步骤的一部分: 1. If strict is false, then … 但是,就我所知, strict指的是函数对象的[[Strict]]内部槽。 这是否意味着: // […]

什么时候应该使用花括号来进行ES6导入?

这似乎是显而易见的,但是我发现自己对于何时使用花括号来导入ES6中的单个模块有些困惑。 例如,在我正在处理的React-Native项目中,我有以下文件及其内容: initialState.js : var initialState = { todo: { todos: [ {id: 1, task: 'Finish Coding', completed: false}, {id: 2, task: 'Do Laundry', completed: false}, {id: 2, task: 'Shopping Groceries', completed: false}, ] } }; export default initialState; 在TodoReducer.js中 ,我必须导入它没有大括号: import initialState from './todoInitialState'; 如果我把大括号中的initialState括起来,那么下面这行代码会出现下面的错误: 无法读取未定义的属性待办事项 TodoReducer.js : export default function todos(state = **initialState.todo**, […]

为什么babel重写导入的函数调用(0,fn)(…)?

给定一个input文件 import { a } from 'b'; function x () { a() } 巴贝尔将编译它 'use strict'; var _b = require('b'); function x() { (0, _b.a)(); } 但是在松散模式下编译时,函数调用会以_b.a();forms输出_b.a(); 我已经做了一些研究,在那里添加逗号运算符,希望有一个解释它的评论。 负责添加它的代码在这里 。

Babel 6改变了它如何导出默认值

之前,babel会添加line module.exports = exports["default"] 。 它不再这样做。 这是什么意思是我可以做之前: var foo = require('./foo'); // use foo 现在我必须这样做: var foo = require('./foo').default; // use foo 不是一个巨大的交易(我猜这是它应该一直以来)。 问题是,我有很多代码依赖于以前的工作方式(我可以将其大部分转换为ES6import,但不是全部)。 任何人都可以给我提示,如何使旧的方式工作,而不必通过我的项目,并解决这个问题(甚至一些如何编写codemod做这个指令将是非常光滑的指令)。 谢谢! 例: input: const foo = {} export default foo 用Babel输出5 "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var foo = {}; exports["default"] = foo; module.exports = exports["default"]; 用Babel […]

“this”在ES6的箭头函数中提到了什么?

我已经在几个地方读到了,关键的区别是“ this是箭头函数的词汇绑定”。 这一切都很好,但我实际上并不知道这意味着什么。 我知道这意味着它在定义函数体的大括号的范围内是唯一的,但我实际上不能告诉你下面的代码的输出,因为我不知道this是指什么,除非它指的是胖箭头function本身….这似乎并不有用。 var testFunction = () => { console.log(this) }; testFunction();