原型
概述
原型是一个公共的对象空间,它里面可以储存对应的公共属性及方法。
构造函数的缺陷
构造函数内如果去之指定方法那么对应的每次实例化都会开辟专门的函数空间去储存对应的操作代码。那么就意味着实例化的对象越多,需要开辟的函数就越多,而这些函数内的操作都是一致,这就会造成对应的资源浪费。那么就会损坏对应的效率。那么解决这个问题我们就可以利用一个公共空间去存储对应的函数,那么这些找到的函数的地址都是一个。而这个公共空间的名字就称为原型。
一般函数储蓄在原型上,属性储存在构造函数内。
函数的原型(prototype)
protype函数内容的一个公共空间,他是一个对象。它属于函数的本身,它被称为显示原型,构造函数也是函数所以他同样具备。
示例
解决构造函数的缺陷就是将对应的函数存放在对应的原型上
注意事项
- 原型上一般存储对应的函数,构造函数一般储存对应的属性
- 原型上具备constructor属性 这个属性指向对应的构造函数
- 原型上的内容使用实例对象可以直接访问
- class中跟constructor一级的hash都是存放在原型上的。
对象的原型( __ proto__ )
属于对象的原型,实例对象也就是对象所以它同样存在,它指向其构造函数的原型,它被称为隐式原型。
构建new方法
注意事项
- _proto__指向其构造函数的prototype
- _proto__非js标签(浏览器支持)
问题
对象的原型为__proto__,它指向对应的构造函数的prototype.这个构造函数的prototype 一直到null为止。 而这个指向其实就是原型链查找的该过程
原型链
在原型上向上查找属性的过程构成的链条 称为原型链
原型链 的查找过程
- 查找自身的__proto__是否具备属性 找到就返回属性值
- 不断向上查找查找对应的父类构造函数的prototype 是否具备这个属性
- 一直查到object的prototype上是否具备这个属性找到返回属性值
- 如果obejct的prototype上还没有找到就会去找null 没有就返回nudefined
原型链不包括对象属性赋值操作
- 对象的属性赋值 如果属性存在就进行替换
- 对象的属性赋值不存在就先进行开辟 再进行赋值
主要事项
- 函数对象的__proto___指向function的prototype
- function的prototype 的__proto__指向object protype
instanceof 判断引用数据类型的类型
示例
实现 递归
循环
继承
概述
继承主要是子类继承父类的非私有属性和方法
继承的实现 class的继承 使用extends关键词实现
特点
extends关键词 可以继承对应的静态属性和方法
原型链继承
通过对应的原型指向来实现继承(将子类的原型指向父类对象)
缺点
- 不能进行初始化构造函数内的属性 ,初始值不能指定
优点
- 可以继承原型上的所有内容
对象冒充
在子类的构造函数内调用父类的构造(传入当前的this)
缺点 可以继承构造函数内的所有属性及可以初始化对应的属性
优点 可以继承原型上的内容
组合继承
原型链继承+对象冒充
缺点
在对象的原型上会存在重复的属性 且值为undefined
好处
解决了对象冒充和原型链继承的不足
缺点
无法继承静态的属性和方法
优点
解决所有其他继承存在的问题
重构数组的高阶函数
Array里面的高阶函数都是存在于对应的原型上
对象调用的方法都是原型方法 类调用的方法都是静态方法
foreach Map 重构