8.Iterator
和 for...of
循环
- 基本概念 :
- 在ES6中新增加了Set和Map两种数据结构,再加上js之前原有的数组和对象,这样就有了四种数据集合,平时还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象等。这样就需要一种统一的接口机制,来处理所有不同的数据结构。
-
Iterator :这就是一种机制,它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署在
Iterator
接口,就可以完成遍历操作,而且这种遍历操作是依次处理该数据结构的所有成员。 -
Iterator遍历器的作用
:
- 为各种数据结构,提供一个统一的、简便的访问接口。
- 使得数据结构的成员能够按某种次序排列。
- ES6新增了遍历命令
for...of
循环,Iterator
接口主要提供for...of
消费。
- 手写Iterator接口
const arr = [1, 2, 3]; function iterator(arr){ let index = 0; return { next: function(){ return index < arr.length ? {value: arr[index++], done: false} : {value: undefind, done: true}; } } } const it = iterator(arr); console.log(it.next()); // 打印结果{value:1, done:false} console.log(it.next()); // 打印结果{value:2, done:false} console.log(it.next()); // 打印结果{value:3, done:false} console.log(it.next()); // 打印结果{value:undefind, done:true}
- Iterator
的遍历过程:
- 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
- 第一次调用指针对象的next()方法,可以将指针指向数据结构的第一个成员。
- 第二次调用指针对象的next()方法,指针就指向数据结构的第二个成员。
- 不断调用指针对象的next()方法,直到他指向数据结构的结束位置。
- 每一次调用next()方法,都会返回数据结构的当前成员信息。具体来说,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。
- 凡是具有
Symbol.iterator
属性的数据结构都具有Iterator
接口 -
凡是具有
Symbol.iterator
属性的数据结构都可以进行解构赋值和使用扩展运算符...
9.class语法
-
基本概念:JS语言的传统方法是通过构造函数,定义并生成新的对象,是一种基于原型的面向对象系统。这种写法跟传统的面向对象语言(比如C++和Java)差异很大,很容易让新学这门语言的人感到困惑。所以在ES6中新增加了类的概念,可以使用class 关键字声明一个类,之后以这个类来实例化对象。
-
实例
class Miaov { constructor(a, b){ this.a = a; this.b = b; return this; } print(){ console,log(this.a + ' ' + this.b ); } }; const miavo = new Miaov ('hello', 'world').print(); // 输出结果:hello world consoe.log(typeof Miaov); // 打印结果:function
- Miaov 中的
constructor
方法是构造方法,this
关键字则代表实例对象。也就是说,ES6的构造函数,对应Miaov 这个类的构造方法。 -
Miaov 这个类除了构造方法,还定义了一个
print
方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去就可以了。另外,方法直接不需要逗号分隔,加了会报错。 -
构造函数的
prototype
属性,在ES6的类上面继续存在。而且类的所有方法都定义在类的prototype
的属性上“`
console.log(Miaov.prototype);
“` -
定义在类中的方法都是不可以枚举的。
“`
console.log(Object.keys(Miaov.prototype));
“` -
constructor
方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor
方法,如果没有显示定义,一个空的constructor
方法会被默认添加。 -
生成类的实例对象的写法,与ES5完全一样,也是使用new命令。如果忘记加上new,像函数那样调用Class,将会报错。
- 继承:
-
案例
“` html
Document
“`
-
说明:
- 子类继承父类 使用
extends
关键字 -
为父类指定静态方法,使用
static
方法名字 -
super
:
- 在构造函数中可以当做一个函数来使用,相当于调用父类的构造函数。
- 在原型方法中,可以当做一个对象来使用,相当于父类的原型对象,并且会自动绑定this到子类上。
- 子类继承父类 使用