ES6(ECMASript 6 新特性---Set,Map,class类)

发布于:2023-01-04 ⋅ 阅读:(196) ⋅ 点赞:(0)

2.13. Set

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

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

set本质上也是个对象,有一些属性和方法

eg. Set.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>集合</title>
</head>
<body>
    <script>
        //声明一个 set
        let s = new Set();
        // 除了创建一个空集合还可以传入一个初始参数,接收一个可迭代数据,数组
        let s2 = new Set(['大事儿','小事儿','好事儿','坏事儿','小事儿']);

        //元素个数(数组length,这里是size)
        // console.log(s2.size);
        //添加新的元素
        // s2.add('喜事儿');
        //删除元素
        // s2.delete('坏事儿');
        //检测has(存在返回true不存在返回false)
        // console.log(s2.has('糟心事'));
        //清空集合
        // s2.clear();
        // console.log(s2);

        for(let v of s2){
            console.log(v);
        }
        
    </script>
</body>
</html>

eg. Set集合实践

1 数组去重

let arr = [1,2,3,4,5,4,3,2,1];
// 数组去重
// 因为set集合具有唯一性,它会自重复的值去除
// 数组构建成集合new Set(arr),把它变成数组使用拓展运算符...
let result = [...new Set(arr)];
console.log(result);

在这里插入图片描述

2 交集

let arr = [1,2,3,4,5,4,3,2,1];
let arr2 = [4,5,6,5,6]
// 首先数组去重,使用filter方法(返个满足条件的新数组)。判断元素在不在ar里面,在就是交集
let result = [...new Set(arr)].filt(item => {
  let s2 = new Set(arr2); // 4 5 6
  // 检测集合里面有没有这个元素
  if(s2.has(item)){
    return true;
  }else{
    return false;
  }
});
console.log(result)
// 代码简化一下
// let result = [...new Set(arr)filter(item => new Set(arr2).h(item)); 
// console.log(result);

在这里插入图片描述

3 并集

let arr = [1,2,3,4,5,4,3,2,1];
let arr2 = [4,5,6,5,6]
// [...arr,...arr2]合并  new Set去再用[...]转化成数组
let union = [...new Set([...arr,.arr2])];
console.log(union);

在这里插入图片描述

4 差集

差集和并集相反,并集取反即可

let arr = [1,2,3,4,5,4,3,2,1];
let arr2 = [4,5,6,5,6];
// arr有 arr2里面没有
let diff = [...new Set(arr)].filter
(item => !(new Set(arr2).has(item)));
console.log(diff);

在这里插入图片描述

2.14. Map

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

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

eg. Map.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Map</title>
</head>
<body>
    <script>
        //声明 Map
        let m = new Map();

        //添加元素
        m.set('name','尚硅谷');
        m.set('change', function(){
            console.log("我们可以改变你!!");
        });
        let key = {
            school : 'ATGUIGU'
        };
        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>
</body>
</html>

Map 其实就是升级版的对象,原来的key是能是字符串,现在可以把对象作为键去创造元素

2.15. class 类

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

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

2.15.1 实例化对象

es5 构造函数实例化对象

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

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

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

在这里插入图片描述

es6 class语法 实例化对象

// es6 class语法 实例化对象
class Phone {
  // 构造方法 constructor 名字固定,特定方法
  // new+类名  就自动执行实例对象上的 constructor方法
  constructor(brand,price){
    this.brand = brand;
    this.price = price;
  }
  // 添加方法  方法必须使用该语法(方法名()) 不能使用 es5 的对象完整形式
  call(){
    console.log("我可以打电话!!");
  }
}
let onePlus = new Phone("1+", 1999);
console.log(onePlus);

在这里插入图片描述

2.15.2 class静态成员

// 首先用es5举例
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);

实例对象nokia和函数对象Phone是不相通的,Phone.name对于name这样的属性我们把它成为静态成员

class Phone {
  // 静态属性 声明关键字是static
  // 对于static 标注的属性name和方法 
change 它属于类Phone 不属于实例对象
  static name = '手机';
  static change() {
    console.log("我可以改变世界");
  }
}
let nokia = new Phone();
console.log(nokia.name);
console.log(Phone.name);

2.15.3 类继承

1 ES5 使用构造函数继承

// 手机
// 父级构造函数
function Phone(brand,price) {
  this.brand = brand;
  this.price = price;
}

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

// 智能手机 也有品牌和价格 所以没必要写重复代码 就可以用继承
// 子级构造函数 
function SmartPhone(brand,price,color,size) {
  // 调用 父级构造函数 里面的初始化代码
  // Phone 通过call方法改变里面的this值 然后执行
  // 这个this 指向SmartPhone里面的this SmartPhone的实例对象
  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,'黑色','55inch');

console.log(chuizi);

在这里插入图片描述

es5构造函数 和 es6类继承 结果是一样的

2 ES6 类的继承

// 父类 Phone
class Phone{
  // 父类构造方法
  constructor(brand,price) {
    this.brand = brand;
    this.price = price;
  }

  // 父类的成员属性
  call() {
    console.log("我可以打电话");
  } 
}

// 声明子类 SmartPhone
// 要求:继承父类里面的属性和方法 
// 使用关键字 extends
class SmartPhone extends Phone {
  // 构造方法  ()里面包含的子类里面的实例化时的初始化参数
  constructor(brand,price,color,size) {
    // 调父类的构造方法来初始化 super就是父类constructor方法
    super(brand,price); // 同 Phone.call(this,brand,price);
    // 把子类里的属性做初始化
    this.color = color;
    this.size = size;
  }

  // 添加子类里面一些独有的方法
  photo() {
    console.log("拍照");
  }
  playGame() {
    console.log("玩游戏");
  }
}

// 实例化
const xiaomi = new SmartPhone('小米', 799, '黑色', '4.7inch');
console.log(xiaomi);
    
// 调用这些方法
xiaomi.call();
xiaomi.photo();
xiaomi.playGame();
    

在这里插入图片描述

2.15.4 子类对父类方法的重写

子类声明一个跟父类同名的方法
根据上面的代码做了一个小的修改

// 父类 Phone
class Phone{
  // 父类构造方法
  constructor(brand,price) {
    this.brand = brand;
    this.price = price;
  }
  // 父类的成员属性
  call() {
    console.log("我可以打电话");
  } 
}
// 声明子类 SmartPhone
// 要求:继承父类里面的属性和方法 
// 使用关键字 extends
class SmartPhone extends Phone {
  // 构造方法  ()里面包含的子类里面的实例化时的初始化参数
  constructor(brand,price,color,size) {
    // 调父类的构造方法来初始化 super就是父类constructor方法
    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();

js class语法中子类是不能直接去调用父类同名方法 用super也不可以 只能重写

在这里插入图片描述

2.15.5 class中的getter和setter设置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>get 和 set</title>
</head>
<body>
    <script>
        // get 和 set 
        // es5 对对象属性进行方法的绑定,比如添加get 对某一个属性进行获得执行get函数
        // class 里面也有使用 
        class Phone{
            get price(){
                console.log("价格属性被读取了");
                return 'iloveyou';
            }

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

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

        // console.log(s.price);
        s.price = 'free';
    </script>
</body>
</html>

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到