1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-27 12:22:21 +00:00

add docs/destructuring

This commit is contained in:
ruanyf 2014-04-25 17:48:30 +08:00
parent 21a32a6a1b
commit b6979dcf81
7 changed files with 280 additions and 4 deletions

View File

@ -1,4 +1,6 @@
# class
# Class和Module
## Class
ES6引入了Class这个概念可以定义class作为对象的模板。
@ -41,3 +43,89 @@ class ColorPoint extends Point {
```
上面代码定义了一个ColorPoint类该类通过extends关键字继承了Point类的所有属性和方法。在constructor方法内super就指代父类Point。
## Module的基本用法
ES6允许将独立的js文件作为模块也就是说允许一个JavaScript脚本文件调用另一个脚本文件从而使得模块化编程成为可能。
假设有一个circle.js它是一个单独模块。
```javascript
// circle.js
export function area(radius) {
return Math.PI * radius * radius;
}
export function circumference(radius) {
return 2 * Math.PI * radius;
}
```
上面代码中的export关键字表示这个方法是对外开放的接口。
然后main.js引用这个模块。
```javascript
// main.js
import { area, circumference } from 'circle';
console.log("圆面积:" + area(4));
console.log("圆周长:" + circumference(14));
```
import语句用来导入模块它接受一个对象里面指定所要导入的方法后面的from指定模块名。
另一种写法是使用module命令整体加载circle.js。
```javascript
// main.js
module circle from 'circle';
console.log("圆面积:" + circle.area(4));
console.log("圆周长:" + circle.circumference(14));
```
module命令跟一个变量表示加载的模块定义在该变量上。
## 模块的继承
模块之间也可以继承。
假设有一个circleplus模块继承了circle模块。
```javascript
// circleplus.js
export * from 'circle';
export var e = 2.71828182846;
export default function(x) {
return Math.exp(x);
}
```
上面代码中的“export *”表示导入circle模块的所有属性和方法。export default命令表示定义模块的默认方法。
加载上面模块的写法如下。
```javascript
// main.js
module math from "circleplus";
import exp from "circleplus";
console.log(exp(math.pi));
```
上面代码中的"import exp"表示将circleplus模块的默认方法加载为exp方法。

121
docs/destructuring.md Normal file
View File

@ -0,0 +1,121 @@
# 多变量的模式赋值
ES6允许按照一定模式一次性对多个变量进行赋值这又称为解构Destructuring
正常情况下,将数组元素赋值给多个变量,只能一次次分开赋值。
```javascript
var a = 1;
var b = 2;
var c = 3;
```
ES6允许写成下面这样。
```javascript
var [a, b, c] = [1, 2, 3];
```
本质上,这种写法属于模式匹配,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些嵌套数组进行模式赋值的例子。
```javascript
var [foo, [[bar], baz]] = [1, [[2], 3]]
var [,,third] = ["foo", "bar", "baz"]
var [head, ...tail] = [1, 2, 3, 4]
```
模式赋值还允许指定默认值。
```javascript
var [missing = true] = [];
console.log(missing)
// true
var { x = 3 } = {};
console.log(x)
// 3
```
模式赋值不仅可以用于数组,还可以用于对象。
```javascript
var { foo, bar } = { foo: "lorem", bar: "ipsum" };
foo // "lorem"
bar // "ipsum"
var o = {
p1: [
"Hello",
{ p2: "World" }
]
};
var { a: [x, { y }] } = o;
x // "Hello"
y // "World"
```
这种写法的用途很多。
1交换变量的值
```javascript
[x, y] = [y, x];
```
2从函数返回多个值
```javascript
function example() {
return [1, 2, 3];
}
var [a, b, c] = example();
```
3函数参数的定义
```javascript
function f({p1, p2, p3}) {
// ...
}
```
4函数参数的默认值
```javascript
jQuery.ajax = function (url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
}) {
// ... do stuff
};
```

View File

@ -1,6 +1,6 @@
# let和const命令
## let命令概述
## let命令
ES6新增了let命令用来声明变量。它的用法类似于var但是所声明的变量只在let命令所在的代码块内有效。

View File

@ -160,3 +160,43 @@ let obj = {
obj[specialMethod](123);
```
## Proxy
所谓Proxy可以理解成在目标对象之前架设一层“拦截”外界对该对象的访问都必须先通过这层拦截可以被过滤和改写。
ES6原生提供Proxy构造函数用来生成proxy实例对象。
```javascript
var proxy = new Proxy({}, {
get: function(target, property) {
return 35;
}
});
proxy.time // 35
proxy.name // 35
proxy.title // 35
```
上面代码就是Proxy构造函数使用实例它接受两个参数第一个所要代理的目标对象上例是一个空对象第二个是拦截函数它有一个get方法用来拦截对目标对象的访问请求。get方法的两个参数分别是目标对象和所要访问的属性。可以看到由于拦截函数总是返回35所以访问任何属性都得到35。
下面是另一个拦截函数的例子。
```javascript
var proxy = new Proxy(target, {
get: function(target, property) {
if (property in target) {
return target[property];
} else {
throw new ReferenceError("Property \"" + property + "\" does not exist.");
}
}
});
```
上面代码表示如果访问目标对象不存在的属性会抛出一个错误。如果没有这个拦截函数访问不存在的属性只会返回undefined。

View File

@ -241,7 +241,7 @@ map.forEach(function(value, key, map) {
上面代码中forEach方法的回调函数的this就指向reporter。
## WeakMap结构
## WeakMap
WeakMap结构与Map结构基本类似唯一的区别是它只接受对象作为键名null除外不接受原始类型的值作为键名。

View File

@ -221,3 +221,29 @@ var r = /hello\d/y;
r.sticky // true
```
## 模板字符串
模板字符串template string是增强版的字符串用反引号`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
```javascript
// 普通字符串
`In JavaScript '\n' is a line-feed.`
// 多行字符串
`In JavaScript this is
not legal.`
// 字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
var x = 1;
var y = 2;
console.log(`${ x } + ${ y } = ${ x + y}`)
// "1 + 2 = 3"
```
上面代码表示,在模板字符串中嵌入变量,需要将变量名写在${}之中。

View File

@ -8,6 +8,7 @@
- [前言](#README)
- [ECMAScript 6简介](#docs/intro)
- [let和const命令](#docs/let)
- [多变量的模式赋值](#docs/destructuring)
- [字符串的扩展](#docs/string)
- [数值的扩展](#docs/number)
- [对象的扩展](#docs/object)
@ -16,7 +17,7 @@
- [Iterator和for...of循环](#docs/iterator)
- [Generator函数](#docs/generator)
- [Promise对象](#docs/promise)
- [Class](#docs/class)
- [Class和Module](#docs/class)
- [参考链接](#docs/reference)
## 其他