文章目录

Set

ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了 iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历,集合的属性和方法:

  1. size 返回集合的元素个数
  2. add 增加一个新元素,返回当前集合
  3. delete 删除元素,返回 boolean 值
  4. has 检测集合中是否包含某个元素,返回 boolean 值
  5. clear 清空集合,返回 undefined

例如:

<script>
//声明一个 set
let s = new Set();
let s2 = new Set(['大事儿','小事儿','好事儿','坏事儿','小事儿']);

//元素个数
// console.log(s2.size);
//添加新的元素
// s2.add('喜事儿');
//删除元素
// s2.delete('坏事儿');
//检测
// console.log(s2.has('糟心事'));
//清空
// s2.clear();
// console.log(s2);

for(let v of s2){
console.log(v);
}

</script>

实践

<script>
let arr = [1,2,3,4,5,4,3,2,1];
//1. 数组去重
// let result = [...new Set(arr)];
// console.log(result);
//2. 交集
let arr2 = [4,5,6,5,6];
// let result = [...new Set(arr)].filter(item => {
// let s2 = new Set(arr2);// 4 5 6
// if(s2.has(item)){
// return true;
// }else{
// return false;
// }
// });
// let result = [...new Set(arr)].filter(item => new Set(arr2).has(item));
// console.log(result);

//3. 并集
// let union = [...new Set([...arr, ...arr2])];
// console.log(union);

//4. 差集
let diff = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));
console.log(diff);

</script>

Map

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。Map 的属性和方法:

  1. size 返回 Map 的元素个数
  2. set 增加一个新元素,返回当前 Map
  3. get 返回键名对象的键值
  4. has 检测 Map 中是否包含某个元素,返回 boolean 值
  5. clear 清空集合,返回 undefined

例如:

<script>
//声明 Map
let m = new Map();

//添加元素
m.set('name','NEFU');
m.set('change', function(){
console.log("我们可以改变你!!");
});
let key = {
school : 'NEFUER'
};
m.set(key, ['北京','上海','深圳']); //键是对象的情况

//size
// console.log(m.size);

//删除
// m.delete('name');

//获取
// console.log(m.get('change'));
// console.log(m.get(key));

//清空
// m.clear();

//遍历
for(let v of m){
console.log(v);
}

// console.log(m);

</script>

class 类

ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

知识点:

  1. class 声明类
  2. constructor 定义构造函数初始化
  3. extends 继承父类
  4. super 调用父级构造方法
  5. static 定义静态方法和属性
  6. 父类方法可以重写

例如:

<script>
//使用ES5的语法
//手机
function Phone(brand,){
this.brand = brand;
this.price = price;
}

//添加方法
Phone.prototype.call = function(){
console.log("我可以打电话!!");
}

//实例化对象
let Huawei = new Phone('华为', 5999);
Huawei.call();
console.log(Huawei);

//使用ES6的class语法
class Shouji{
//构造方法 名字不能修改
constructor(brand,){
this.brand = brand;
this.price = price;
}

//方法必须使用该语法, 不能使用 ES5 的对象完整形式
call(){
console.log("我可以打电话!!");
}
}

let onePlus = new Shouji("1+", 1999);

console.log(onePlus);
</script>

class里的静态成员

例如:

<script>
// function Phone(){

// }
// Phone.name = '手机';
// Phone.change = function(){
// console.log("我可以改变世界");
// }
// Phone.prototype.size = '5.5inch';

// let nokia = new Phone();

// console.log(nokia.name);
// // nokia.change();
// console.log(nokia.size);

class Phone{
//静态属性
static name = '手机';
static change(){
console.log("我可以改变世界");
}
}

let nokia = new Phone();
console.log(nokia.name);
console.log(Phone.name);
</script>

实例对象和函数对象的属性是不互通的,实例对象和构造函数的原型对象(也就是Phone.prototype)是互通的。

说白了静态属性是一种类属性,他属于类,不属于实例对象,类访问得到,而对象访问不到。(跟java有些不同,java是允许的)

构造函数继承

ES5写法:

<script>
//手机
function Phone(brand,){
this.brand = brand;
this.price = price;
}

Phone.prototype.call = function(){
console.log("我可以打电话");
}

//智能手机
function SmartPhone(brand, price, color,){
Phone.call(this, brand, price);
this.color = color;
this.size = size;
}

//设置子级构造函数的原型
SmartPhone.prototype = new Phone;
SmartPhone.prototype.constructor = SmartPhone;

//声明子类的方法
SmartPhone.prototype.photo = function(){
console.log("我可以拍照")
}

SmartPhone.prototype.playGame = function(){
console.log("我可以玩游戏");
}

const chuizi = new SmartPhone('锤子',2499,'黑色','5.5inch');

console.log(chuizi);

</script>

ES6写法:

<script>
class Phone{
//构造方法
constructor(brand,){
this.brand = brand;
this.price = price;
}
//父类的成员属性
call(){
console.log("我可以打电话!!");
}
}

class SmartPhone extends Phone {
//构造方法
constructor(brand, price, color,){
super(brand, price);// Phone.call(this, brand, price)
this.color = color;
this.size = size;
}

photo(){
console.log("拍照");
}

playGame(){
console.log("玩游戏");
}

call(){
console.log('我可以进行视频通话');
}
}

const xiaomi = new SmartPhone('小米',799,'黑色','4.7inch');
// console.log(xiaomi);
xiaomi.call();
xiaomi.photo();
xiaomi.playGame();
</script>

子类对父类方法的重写

直接同名方法重写即可。

class里的get、set方法

<script>
// get 和 set
class Phone{
get price(){
console.log("价格属性被读取了");
return 'iloveyou';
}

set price(newVal){
console.log('价格属性被修改了');
}
}

//实例化对象
let s = new Phone();

// console.log(s.price); //-->价格属性被读取了 iloveyou
s.price = 'free'; //-->价格属性被修改了
</script>