对象访问机制
- 当你访问一个对象的成员的时候, 会先在自己身上找
- 自己没有, 去到
__proto__
上找 - 再没有, 去到
__proto__
上找 - 一直找到顶级对象的
__proto__
都没有 - 就返回
undefined
定义
- 定义1: 每一个对象都有
__proto__
- 随便一个实例化对象的
__proto__
是所属构造函数的prototype
- 定义2: 每一个函数都有一个
prototype
, 他是一个对象 - 每一个构造函数的
prototype
应该也有__proto__
- 构造函数也是函数, 函数也是一个对象
只要是函数,就是Function的实例,构造函数也是
只要是对象,就是Object的实例,Function的原型对象也是
function Person(){
this.name = 'Jack'
this.age = 18
this.gender = '男'
}
// 创建一个实例
let p1 = new Person()
定义:
- 每一个函数天生自带一个属性叫做
prototype
, 是一个对象 - 每一个对象天生自带一个属性叫做
__proto__
指向所属构造函数的prototype
- 当一个对象, 没有准确的构造函数来实例化的时候, 我们都看作是内置构造函数
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__
串联起来的对象链状结构, 叫做原型链 - 原型链作用: 为了对象访问机制服务
注: 只要是函数, 就是大写Function的实例;,构造函数也是
只要是对象,就是Object的实例,Function的原型对象也是
内置构造函数 Object 是 内置构造函数 Function 的实例;
顶级对象一定是 Object 的 prototype, 函数的顶级一定是内置构造函数 Function
- 原型 是每一个函数天生自带的一个对象空间, 在里面写方法是供实例使用的, 多个实例共享该方法
- 原型链 是使用 __ proto__ 串联起来的对象链状结构, 是为了对象访问机制服务的
它俩完全是两个概念
function Foo(){ }
Foo()是个函数,也是对象,具有
__proro__
属性
只要是函数, 就是大写Function的实例;
__proto__
指向所属构造函数的prototype
Foo()的__proro__
指向Function.prototype
Object ()是个函数,也是对象,具有
__proro__
属性
只要是函数, 就是大写Function的实例;
内置构造函数 Object 是 内置构造函数 Function 的实例;
Object 的__proro__
指向Function.prototype
Function自身能够生成自身,即Function的原型就是Function。
Function的__proro__
指向Function.prototype