最新

javascript

ES6 Reflect

简单谈谈 Reflect:反射,语言层面上的内容,在 ES6 中其出现的目的主要有以下几个: * 将 Object 下属于语言内部的方法,放到 Reflect 上,让 Object 更加纯粹。 * 修正之前在 Object 下的一些方法的返回值不合理照成的逻辑混乱。 * 将命令式的行为变成函数行为,如: name in obj ==> Reflect.has(obj, name)。 * 与 Proxy 下的方法一一对应,Proxy 可以更方便的完成默认行为的调用。 拥有的方法 目前一共有 13 个方法,与 Proxy 下的方法一一对应,直接调用这些方法就完成了 Proxy 默认的行为。 * Reflect.apply(target, ctx, args) * Reflect.

By Breeze

javascript

ES6 Iterator

简单谈谈 Iterator(遍历器)是一种机制:当外部访问所属对象时,提供统一的访问机制。任何的数据结构一旦部署了 Iterator 接口,就相当于实现了统一的遍历机制,使得外部程序在使用这些不同的数据结构时,有一致的写法。 具体到语言层面,需要实现了以下内容: 1. 对象下需要部署 Symbol.iterator 方法。 2. 该方法需要返回一个含有 next 方法的对象:{ next: () => { value: any, done: boolean } }`。 3. 该对象的 next 方法需要有统一的返回结构:{ value: any, done: boolean }。 部署了上述特性的对象,就叫做:可遍历对象。在 ES6 中,Map、Set、Array、String 等的实例都具备上述结构。但并非仅有这些类的实例时可遍历对象,只要是对象有上述特性,

By Breeze

javascript

ES6 Generator

简单谈谈 Generator:状态机,封装了多个内部状态。执行 Generator 返回一个遍历器对象,用于变量每一次的状态。 简单来说,一个 Generator 函数,就像一段楼梯,规定了楼梯的步数以及没一步的状态,调用它就生成了一段楼梯,每走一步都会有具体的执行内容以及返回值,并且只能往前走( yield ),或是走到头了( return )。 Generator 函数的标志就是 function 后面带 * 号。 一个简单的例子: function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } let hw = helloWorldGenerator(); 该 Generator 函数规定了 3 级台阶(两个 yield

By Breeze

javascript

ES8 async & await

简单谈谈 async 是什么?一句话,它就是 Generator 函数的语法糖。 既然是语法糖,那么先来对比下 async 函数和 Generator 函数的区别。以下是分别用 async 和 Generator 写的异步操作: const fs = require('fs'); const readFile = function (fileName) { return new Promise((resolve, reject) => { fs.readFile(fileName, (error, data) => { if (error) return reject(error); resolve(data); }); }); }; // Generator 的写法 &

By Breeze

javascript

ES6 Class 继承

简单谈谈 ES6 规定了 extends 关键字,用该关键字就可以实现继承,对比 ES5 通过修改原型链来实现继承,可以说简洁了不少。 class Point { }; class ColorPoint extends Point { constructor(x, y, color) { // 调用父类的constructor(x, y) super(x, y); this.color = color; } toString() { // 调用父类的toString() return this.color + ' ' + super.toString(); } } 当然子类如果没有定义 constructor 方法,这个方法会被默认添加。 class ColorPoint extends Point { } // 等同于 class ColorPoint extends

By Breeze

javascript

ES6 Generator 的异步使用技巧

异步 在 JavaScript 界,异步是获取数据的主旋律,大概有以下几种方式: * callback 回调 * Promise * event 事件 简单说说以上 3 种模式: 回调 将需要执行的函数传入异步调用内,在异步调用结束后,主动执行传入的函数。 function doSomeAsync(callback) { let data = {/* 数据 */}; setTimeout(() => { callback(data); }); } doSomeAsync((data) => { // do some thing doSomeAsync((data) => { // do some thing }); }); 但试想一下,如果说回调之中还有回调,那么将会形成一个类似金字塔的结构(回调地狱),代码将变难以维护。 Promise 出现了回调地狱,我们得解决,这就出现了 Promise,

By Breeze

javascript

ES^ Decoretors

类的修饰 许多面向对象的语言都有修饰器( Decorator )函数,用来修改类的行为。 @testable class MyTestableClass { // ... } function testable(target) { target.isTestable = true } MyTestableClass.isTestable; // true testable 函数即为修饰器,为 MyTestableClass 类添加了名为 isTestable 的静态属性。 一个修饰器可以理解为包装之后跟着的类的函数。 @decorator class A {} // 等同于 class A {} A = decorator(A) || A 也就是说,修饰器是一个对类进行处理的函数。修饰器函数的第一个参数,就是所要修饰的目标类。 当然只要在 @ 符号后是一个函数即可,因此为了可以生成更加灵活的修饰器,我们可以通过函数返回函数的形式来编写修饰器。 function testable(isTestable) { return

By Breeze