prototype (原型 / 原型对象)
+ 定义: **每一个函数天生自带一个属性叫做 prototype,他是一个对象**
+ 只要函数定义好以后,这个 prototype 就出生了
+ 构造函数也是函数,构造函数也有 prototype,我们可以像里面添加一些内容
+ 这个天生自带的 prototype 里面有一个属性叫做 constructor
=> 表示我是哪一个构造函数伴生的原型对象
__proto__(原型链/连接点)
+ 定义: **每一个对象天生自带一个属性,叫做__proto__,指向所属构造函数的prototype**
+ 实例化对象也是一个对象
+ 实例化对象也有__proto__属性
原型链
对象访问机制
+ 当你访问一个对象的成员的时候,会先在自己身上找
+ 自己没有去到 __proto__ 上找
+ 再没有,再去 __proto__ 上找
+ 一直找到*对象的 __proto__ 都没有
+ 就返回 undefined
分析:
+ 定义1:每一个对象都有 __proto__
+ 随便一个实例化对象的 __proto__ 是所属构造函数的 prototype
+ 定义2:每一个函数都有一个 prototype,他是一个对象
+ 每一个构造函数的 prototype 应该也有一个 __proto__,指向了谁?
+ 构造函数也是函数,函数也是一个对象
+ 函数应该也有一个 __proto__,指向了谁?
定义:
1.每一个函数天生自带一个属性叫做 prototype,是一个对象
2.每一个对象天生自带一个属性叫做 __proto__ 指向所属构造函数的 prototype
3.当一个对象没有准确的构造函数来实例化的时候,我们都看做是内置构造函数 Object 的实例
例子:
1.var arr = [] , Array的实例
2.var obj = {} , Object的实例
3.var p1 = new Person() , Person的实例
4.var time = new Date() , Date的实例
5.var fn = function (){} , Function的实例
6.Person.prototype , Object的实例
7.Array.prototype , Object的实例
结论:
+ 任何一个对象开始触发
+ **按照__proto__开始向上查找**
+ 最终都能找到Object.prototype
+ 我们管这个使用 __proto__ 串联起来的对象链状结构,叫做原型链
+ 原型链作用:为了对象访问机制服务
什么是原型,什么是原型链
+ 原型是每一个函数天生自带的对象空间,他在里面写方法是为了给实例使用的,多个实例共享方法
+ 原型链就是使用原型链 __proto__ 串联起来的对象链状结构,是为了对象访问机制服务的