js:ES6新增:数据类型:Symbol,数据集合,面向对象编程的语法与原型链 - 第十七天
js:ES6新增:数据类型:Symbol,数据集合,面向对象编程的语法与原型链 - 第十七天
# 一、复习
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();
```

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