原型
原型是什么?
- 是一个对象,把prototype称为原型对象
原型的作用是什么?
- 共享方法
构造函数很好用,但是存在资源浪费的问题 看下面 两个函数中的同一个方法,却要开辟两个空间存储,造成了资源浪费
所以就有了原型,构造函数通过原型分配的函数是所有对象所共享的,javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象,这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有的。我们可以把那些不变的方法,直接定义在prototype对象上,这样所有的对象实例就可以共享这个方法,
原型链
在 JS 所有对象中,只要是对象,都会有一个内置属性叫做_proto_,而且这个属性是系统自动生成的,只要你创建一个对象,这个对象就有这个属性。这个_proto_属性指向的是原型对象 __proto__是对象实例和它的构造函数之间建立的链接,它的值是:构造函数的`prototype。 也就是说: proto__的值是它所对应的原型对象,是某个函数的prototype Object.getPrototypeOf(target)全等于__proto。
- 每个对象都有一个__proto__指向构造函数的prototype原型对象而原型对象本身也是对象,也有__proto__指向的是上一个构造函数的prototype
- 每个对象都会有一个属性__proto__指向构造函数的prototype原型对象,之所以我们对象使用构造函数prototype原型对象的属性和方法,就是因为对象有__proto__原型的存在 __proto__对象原型和原型对象prototype是等价的
- 对象原型和构造函数的原型对象里面都有一个属性constructor属性,称为构造函数,因为他指回构造函数本身
- 如果我们修改了原来的原型对象,给对象原型赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
- 固有的原型对象不能修改否则会失去固有的方法 类似于这种 Star.prototype={},只可以添加方法 类似于Star.prototype.xxxx={}
原型链是什么?顾名思义,肯定是一条链,既然每个对象都有一个_proto_属性指向原型对象,那么原型对象也有_proto_指向原型对象的原型对象,直到指向下图中的null,这才到达原型链的顶端。
ps :查找规则---就近原则