javascript第4版
javascript语言核心特性
基础
- 运算符
- 数据类型
- 流程控制
- 变量
动态类型
弱类型
面向对象
-
原型链
-
任何时候创建一个函数,就会有响应的规则为这个函数创建一个prototype属性,指向原型对象
-
该原型对象会自动获得一个constructor属性 指向该构造函数,其余属性都继承自object对象
-
每次创建通过构造函数创建对象实例,实例的prototype属性指向构造函数的prototype指向的原型对象
- 但是js实例对象上没有prototype属性 故诞生了proto 在这里就理解为前面的prototype属性
-
结论:实例与构造函数指向的原型对象有联系,与构造函数没有
-
构造函数 实例 原型对象是三个不同的对象
-
同一个构造函数创建的实例对象 共享原型对象
-
判断是否为原型对象 isprototypeof实例
- 取得原型对象 getprototypeof
-
修改对象的原型对象
- setprototypeof
- 通过create指定原型对象
-
实例对象可以访问原型对象上的值,但是不是修改
-
如何确定属性在实例上,还是在原型对象上
- hasownproperty
-
两种访问属性的操作符
-
in操作服
- 可以访问实例对象 或者原型对象属性 两者都返回true
-
for in操作
-
-
-
继承
-
对象
-
对象创建
-
new一个对象 然挂载属性创建
- new object
-
字面量创建
-
工厂模式
-
创建函数
- 函数内new object
- 然后挂载属性
- 返回对象
-
-
构造函数模式
-
new person 注意this
-
会进行如下操作
-
1.内存中创建一个对象
-
2.对象的prototype属性会赋值为构造函数的prototype属性
- 而新创建对象的constructor属性指向Person函数
-
3.构造函数中的this指向这个对象
-
4.执行构造函数代码 挂载属性
-
5.若非空,返回创建的对象 否则,返回刚创建空对象
-
-
构造函数也是函数 唯一区别 调用方式不同
-
若直接调用,属性挂在window对象
-
问题:实例方法都挂在每一个实例的上面 同名却不相等
-
解决:定义全局方法,然后挂载在构造函数方法上
-
新问题:导致全局作用域下很多自定义的方法(尤其含有this)
-
解决办法 prototype
-
每个函数都走prototype属性,它是一个对象,是通过调用构造函数创建的原型对象
-
好处
- 在其上面定义的属性和方法会被对象实例共享,这里面的方法都是同一个引用,而不是每个实例都挂载一个不同的引用。节省空间,也解决了污染全局作用域
-
-
-
-
-
-
-
对象属性
-
数据属性
-
描述属性特征 一般用双中括号括起来
-
[[configurable]]
-
默认为true 是否可以删除该属性 是否可以修改以下几个特性 如果为false则该属性的defineProperty则失效
- 该属性被设置为false就不能设置为true 了
-
-
[[enumerable]]
- 默认为true 是否可以通过for-in拿到这个属性
-
[[writable]]
- 默认为true 表示值是否可以被修改
-
[[value]]
- 默认值undefined
-
-
访问器属性
-
不含数据值
-
getter实例
-
setter实例
- 参数为设置的新值
-
-
定义多个属性
- defineproperties静态
-
获得属性描述符
-
getownpropertydescriptor静态
-
对于数据属性
- 返回configurable,enumerable,writable,value
-
对于访问器
- 返回get set configuarable enumerable
-
-
getownpropertydescriptors静态
- 对象每个自由属性调用getownpropertydescriptor
-
-
-
合并对象
-
assign
-
一个目标对象
-
几个属性源对象
-
复制的属性为源对象中1,可枚举的属性和2,自由的属性3,字符串和符号为键的属性
-
复制原理 取源对象属性的get拿到值 赋值到目标对象的set函数参数里面
-
结果对象和目标对象属于一个引用
-
本质,为浅复制
- 只复制源对象上一些复杂类型值的引用(内存地址)
-
无回滚,中间复制中断,可完成中断之前的复制,这里和数据库操作类比一下 很容易理解
-
-
-
对象标识 及相等判定
-
===
- nan===nan返回false 必须使用isnan判断
- {}==={} false
- +0===-0 true
- +0===0 true
- -0===0 true
-
object.is
- 接受两个比较的参数 和===类似 有区别
- +0 0 true
- -0 0 false
- nan nan true
- +0 -0 false
- 比较多个 使用递归
-
-
增强对象语法
-
属性值简写
-
可计算属性
- 中括号
-
简写方法名
- 获取与设置函数同样适用
- 与可计算属性兼容
-
对象解构
- 属性名不同
- 设置默认值
- 结构右值会自动执行toobject
- 嵌套解构 结构源属性值为对象的 为引用
-
-
-
封装
- 隐藏细节 暴露接口
-
多态
- 同一个接口不同对象的不同行为
-
抽象
- 对象抽象描述,定义一些对象的共同特征
解释执行
函数式编程
- 高阶函数
- 闭包