原型与原型链图
栈(stack):由编译器自动分配释放,存放函数参数值,局部变量,先进后出的一个队列
堆(heap):一般由程序员分配释放,集合,无序
原型链
原型链通俗易懂的理解就是可以把它想象成一个链条,互相连接构成一整串链子!
原型链的实现过程
1.函数必然有prototype和__proto__属性,所有的函数都是Function实例的对象
2.对象必然有__proto__属性,但不一定有prototype属性,实例对象通过__proto__属性连接到构造函数的prototype属性上
3.Function是所有实例对象的自定义构造函数
4.Function.prototype通过__proto__属性找到了Object.prototype,该对象的__proto__再往下就是null,Function其实是Object的实例对象
5.由始至终引用Object只有向外指的箭头,而没有指入的箭头,原因就是万物皆对象
为什么要使用原型链呢?
- 为了实现继承,简化代码,实现代码重用!
- 只要是这个链条上的内容,都可以被访问和使用到!
使用原项链有什么作用?
- 继承
- prototype用来实现基于原型的继承与属性的共享
- 避免了代码冗余,公用的属性和方法,可以放到原型对象中,这样通过该构造函数实例化的所有对象都可以使用该对象的构造函数中的属性和方法!
- 减少了内存占用
原型链的特点
- 就近原则,当我们要使用一个值时,程序会优先查找离自己最近的,也就是本身有没有,如果自己没有,他就会沿着原型链向上查找,如果还没有找到,他还会沿着原型链继续向上查找,找到到达Object
- 引用类型,当我们使用挥着修改原型链上的值时,其实使用的时同一个值!
- JS中每个函数都存在原型对象属性prototype。并且所有函数的默认原型Object的实例。
- 每个继承父函数的实例对象都包含一个内部属性proto。该属性包含一个指针,指向父函数的prototype。若父函数的原型对象的proto属性为在上一层函数。在此过程中就形成了原型链。
proto 和 prototype的区别
-
proto: 是实例对象指向原型对象的指针,隐式原型,是每个对象都会有的一个属性。
-
prototype:是构造函数的原型对象,显式原型,只有函数才会有。
原型链总结:
实例对象:使用new关键字创建的对象
所有的函数都是一个Function类型的实例对象,简称函数对象
Object的原型对象为null,Object的实例对象不是Object
函数的显示原型指向的对象默认是空的object实例对象(但是object不满足)