# 一、复习

1、this的绑定:this表示当前所在函数的执行对象

    - 默认绑定:没有明确隶属对象的函数,直接执行,内部this指向window

    - 隐式绑定:有明确隶属对象的函数,被对象执行,内部的this指向该对象

        - 隐式丢失:将属于该对象的函数赋值给变量或传参,通过变量或参数执行,原本的this会丢失到window身上

    - 强制绑定:通过函数的方法(call,apply,bind)强行指定this的指向,this就是指向对象

    - new绑定

2、函数的方法 - 改变this指向

    - call:

        - 第一个参数是this的指向

        - 第二个及之后的参数,都会作为实参传入原函数

        - 会自动执行改变之后的函数,返回值为原函数的返回值

    - apply:

        - 第一个参数是this的指向

        - 第二个参数必须为数组,会自动解析,将解析出的数据作为实参传入原函数

        - 会自动执行改变之后的函数,返回值为原函数的返回值

    - bind:

        - 第一个参数是this的指向

        - 第二个及之后的参数,都会作为实参传入原函数

        - 返回值为改变this之后的新函数

3、ES6的新增

    - 声明关键字:let,const,class,import,export

    - 箭头函数:()=>{}

    - 展开运算符:...复杂数据

    - 解构赋值:解开解构进行赋值

    -  字符的新增

        - Unicode编码的转换

            - 转Unicode:str.codePointAt()

            - 转字符:String.fromCodePoint()

        - Unicode在浏览器中新的表示方式:\u{20bb7}

        - 字符的方法

            - str.includes()

            - str.startsWith()

            - str.endsWith()

            - str.repeat(n)

        - 字符串模板:反引号`

            - 标记变量:${}

            - 支持换行


 

# 二、ES6新增:Symbol

1、新的数据类型:Symbol

    - 类字符的数据类型,突出了字符的标记功能,Symbol类型主要用来做标记数据使用,自身值不重要,主要是自身所表示的标记

2、创建Stmbol

    - let s = Symbol();

    - 任何两个Symbol都不相等

3、Symbol使标记的定义和使用,容错率更高,语义化更好

# 三、ES6新增 - 数据集合

1、数据的新的集合形式,不是新的数据类型

2、ES6新增了:set集合和map集合

3、set集合:对应数组,但不允许数据重复(数组的映射)

    -创建:new Set(数组)

4、map集合:对应对象,但不存在键值对,本质为值值对

    -创建:new Map()

5、方法或属性

    - 数据的个数:s|m.size

    - 数据中值对应的名字集合:s|m.keys()

    - 数据中值的集合:s|m.values()

    - 数据中数据的集合:s|m.entries()

    - 给set添加数据:s.add(值)

    - 给map添加数据:m.set(名, 值)

    - 读取map的数据:m.get(名)

6、新的遍历方式:for-of

    - for-in遍历的是索引或key

        - 无法遍历set和map

    -for-of遍历的是值

        - 无法遍历对象

# 五、面向对象编程 - 理论

1、面向

    - 以...

    - 面向语言:

        - 面向二进制编程:机器语言

        - 面向指令编程:汇编语言

        - 面向自然语言编程:现代编程

    - 编程方式

        - 面向过程编程:步骤式编程

        - 面向函数编程:将每个不同的功能封装成函数,拼接成函数

        - 面向对象编程:先将大需求拆解成小需求,逐个实现每个小需求,建立每个小需求的联系,依次拼接成完整需求

        - 面向模块编程

        - 面向组件编程

2、对象

    - 数据的无序集合

    - 优势:

        - 传输速度

        - 查找速度

3、面向对象(OO)

    - 面向对象分析(OOA):拆解

    - 面向对象设计(OOD):建立联系

    - 面向对象编程(OOP):功能之间的实现和调用

4、面向对象的编程的特点

    - 封装:最基本的操作,封装函数,封装对象

    - 继承:某个具体的实现继承了另外的通用功能,才能完成具体的实现

    - 多态:实现功能的过程中,不需要考虑功能的归处,可以拥有多种形态的使用方式

5、面向对象来自于分工协作

# 五、面向对象编程 - 语法

1、创建对象:

    - 单列模式:创建一个对象,并只操作一个对象

    - 工厂模式:可以批量创建同特点对象

        - 自定义封装函数(废弃)

        - 构造函数(内置)

            - 利用new执行函数(new的原理)

                1. 创建一个新对象

                2. 修改原函数的this指向该对象

                3. 将这个新`对象的原型链`指向原函数的`prototype`属性

                4、检测new执行的函数是否主动返回对象,如果没有,就返回第一步创建的 新 对象

2、原型

    - 原型属性:prototype,专属于函数的一个内置对象

        - 作用:为了给将来自身被new执行时创建出来的对象的原型链指向

    - 原型链:` __proto__`专属于对象的一个内置属性,对象类型

        - 作用:用来指向创建自身的函数的`prototype`

    - 对象访问属性或方法的规则:

        - 先在自身查找,找到了就使用,找不到,顺着原型链依次向上查找,任意一层找到了,就停止查找使用,如果到顶层都找不到,抛出undefined

        - 如果多层原型链中都存在同名方法,就近使用

    -所有对象的原型链,最终必然指向`Objct.prototype`

        -js万物皆对象

    - 原型链关系的检测

        - `函数.prototype.isPrototypeOf( 实例 )`

        - `实例 instanceof 函数`

        - 有关系得到true,没有关系得到false

    ```js

    function fn(){}

    console.log(fn.prototype);

    const f1 = new fn();

    // f1的原型链指向fn原型属性    √

    console.log( f1.__proto__ === fn.prototype );

    console.log( Object.prototype.isPrototypeOf( f1 ) );

    console.log( fn.prototype.isPrototypeOf( f1 ) );

    console.log( f1 instanceof fn );

    console.log( f1 instanceof Object );

    ```

3、 面向对象编程的语法

    - 对象的属性,在构造函数内定义

    - 对象的方法,在原型上定义

    - 构造函数中的this指向将来的实例

    - 原型方法因为将来会被实例执行,所以原型方法内的this可以认为指向将来的实例(一般情况下,构造函数的this和原型方法的this是同一个this)

    ```js

    function fn(m){

        // 属性

        this.message = m;

    }

    // 方法

    fn.prototype.show = function(){

        console.log(this.message);

    }

    // 创建实例

    const f1 = new fn("hello");

    f1.show();

    ```

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐