var Point = function(x, y) {
//...
};
point.prototype.toString = function() {
/*...*/
};
Object.keys(Point.prototype); //['toString']
constructor 方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法。一个类必须有 constructor 方法,如果没有显式定义,一个空的 constructor 方法会被默认添加
与函数一样,类也可以使用表达式的形式定义。
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
let inst = new MyClass();
inst.getClassName(); // Me
Me.name; // ReferenceError: Me is not defined
上面代码表示,Me 只在 Class 内部有定义。
如果类的内部没用到的话,可以省略 Me,也就是可以写成下面的形式。
const MyClass = class {
/*...*/
};
采用 Class 表达式,可以写出立即执行的 Class。
let person = new class {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}('小明');
person.sayName(); //小明
Promise 对象是一个构造函数,用来生成 Promise 实例
Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
async 函数是什么?一句话,它就是 Generator 函数的语法糖。
内置执行器 Generator 函数的执行必须靠执行器,所以才有了 co 模块,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行。
更好的语义
async
和await
,比起星号
和yield
,语义更清楚了。async
表示函数里有异步操作,await
表示紧跟在后面的表达式需要等待结果。更广的适用性 co 模块约定,
yield
命令后面只能是Thunk
函数或Promise
对象,而async
函数的await
命令后面,可以是Promise
对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即resolved
的Promise
对象)返回值是 Promise
async
函数的返回值是Promise
对象,这比Generator
函数的返回值是Iterator
对象方便多了。你可以用then
方法指定下一步的操作。进一步说,
async
函数完全可以看作多个异步操作,包装成的一个Promise
对象,而await
命令就是内部then
命令的语法糖。上面代码是一个获取股票报价的函数,函数前面的 async 关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个 Promise 对象。
上面代码中,函数 f 内部 return 命令返回的值,会被 then 方法回调函数接收到。
上面代码中,第二个 await 语句是不会执行的,因为第一个 await 语句状态变成了 reject。
有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个 await 放在 try...catch 结构里面,这样不管这个异步操作是否成功,第二个 await 都会执行。
上面两种写法,getFoo 和 getBar 都是同时触发,这样就会缩短程序的执行时间。
async 函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里
可以看到 Async 函数的实现最简洁,最符合语义,几乎没有语义不相关的代码。它将 Generator 写法中的自动执行器,改在语言层面提供,不暴露给用户,因此代码量最少。如果使用 Generator 写法,自动执行器需要用户自己提供。
Point 类除了构造方法,还定义了一个 toString 方法。注意,定义“类”的方法的时候,前面不需要加上 function 这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
constructor
方法是类的默认方法,通过new
命令生成对象实例时,自动调用该方法。一个类必须有 constructor 方法
,如果没有显式定义,一个空的constructor 方法会被默认添加
上面代码表示,Me 只在 Class 内部有定义。 如果类的内部没用到的话,可以省略 Me,也就是可以写成下面的形式。
上面代码中,Foo 类使用在前,定义在后,这样会报错,因为 ES6 不会把类的声明提升到代码头部。这种规定的原因与下文要提到的继承有关,必须保证子类在父类之后定义
首先,Module 语法是 JavaScript 模块的标准写法,坚持使用这种写法。使用 import 取代 require。
数组的解构