原型
概述
原型是一个公共的对象空间,它里面可以存储对应的公共属性及方法
构造函数的缺陷
构造函数内如果去指定方法,那么对应的每次的实例化都会开辟专门的函数空间去存储对应的操作代码。那么就意味着我实例化的对象越多,需要开辟的函数就越多,而这些函数内的操作都是一致的,这就会造成对应的资源浪费。那么就会损耗对应的效率。那么解决这个问题我们就可以利用一个公共空间去存储对应的函数,那么这些找到的函数的地址都是一个,而这些公共空间的名字就称为原型
一般函数存储在原型上,属性存储空间在构造函数内
函数的原型(prototype)
peototype是函数内的一个公共空间,它是一个对象,他属于函数的本身,他被称为显示原型,构造函数也是函数所以他同样具备
解决构造函数的缺陷就是将对应的函数存放在对应的原型上
注意事项
- 函数存储在原型上,属性存储在构造函数内。
- 原型上具备constructor属性 这个属性指向对应的构造函数
- 原型上的内容使用实例对象可以直接访问
- class中跟constructor一级的函数自动存放在原型上
对象的原型 ( proto )
proto 是属于对象的原型,实例对象也是对象所以它同样存在。它指向其构造函数的原型,被称为隐式原型。 示例
注意实现
proto 指向其构造函数的prototype proto 非JavaScript标准(浏览器支持)
问题
对象的原型为 proto ,它指向对应的构造函数的prototype。这个构造函数的prototype也是一个对象,那么它同样也具备对应的 proto ,那么对应构造函数的原型对象的 proto 又指向谁?
对应的指向从当前的构造函数的prototype 一直到 null为至 而这个指向的过程其实就原型链查找的过程
原型链
在原型上向上查找属性的过程构成的链条(不断在__proto__查找) 称为原型链
原型链的查找过程
- 查找自身的 proto 是否具备属性找到就返回属性值
- 不断向上查找对应的父类构造函数的prototype是否具备这个属性 找到返回属性值
- 一直查到Object的prototype上是否具备这个属性 找到返回属性值
- 如果Object的prototype上还没有找到就会去找null 返回undefined
原型链不包含对象属性赋值操作
- 对象的属性赋值属性存在就进行替换
- 对象的属性赋值属性不存在就先进行开辟 再进行赋值
注意事项
- 函数对象的 proto 指向Function的prototype
- Function的prototype的 proto 指向Object.prototype
- Object.prototype指向null 返回undefined
instanceOf 判断引用数据类型的类型
console.log(new String('123') instanceof String ) //true
console.log(new String('123') instanceof Object ) //true