为解决构造函数声明对象时浪费内存的问题,可以使用原型对象实现实例方法共享
解决浪费内存问题的原理:
因此,在构造函数时,将公共属性和方法写入prototype 原型对象
原型对象内,节约内存,实现实例化对象公共属性的共享
例如 扩展数组求和方法:
实例对象都会有一个属性proto指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有proto原型的存在
proto是JS非标准属性(只读不能赋值)
[[prototype ]]和proto意义相同
用来表明当前实例对象指向哪个原型对象prototype
即:对象原型指向原型对象
只要是实例化对象就有proto 它指向该对象的原型对象
普通构造函数的原型对象也是一个对象 也有proto 指向Object构造函数的原型对象
Object构造函数的原型对象也有proto但是它指向null 空
例如:
总的来说:
原型链就是一种查找规则:
1.当访问一个对象的属性或者方法时,首先查找这个对象自身有没有该属性
2.如果没有就查找它的原型
3.如果还没有就查找原型对象的原型
4.以此类推直到查找到Object为止
5.proto对象原型的意义就在于为对象成员查找机制提供一个方向
例如:
map方法就在构造函数Array的原型对象上,声明的普通数组想要使用就需要一层层查找到Array的原型对象上
6.可以使用instanceof运算符用于检测构造函数的prototype属性(原型)是否出现在某个实例对象的原型链上
即 实例对象是否在属于某构造函数