这是我参与「第四届青训营 」笔记创作活动的第1天
函数高级之原型链
原型链
访问一个对象的属性时
- 先在自身属性中查找,找到返回
- 若没有,再沿着__proto__这条链向上查找,找到返回
- 若最终没有找到,返回undefined
别名
- 隐式原型链
作用
- 查找对象的属性和方法
Function
-
所有的函数,不管是自己定义的还是内置的,都是new Function()产生的。也就是说所有的函数对象都是Function的一个实例对象
-
Function.prototype === Function.proto
-
所有函数对象的隐式原型都指向Function的显示原型
函数对象关系图
原型链关系图
最关键的一句话
实例对象的隐式原型的指向等于构造函数的显示原型
总结
函数的显式原型指向的对象:空Object(实例)对象【除了Object这个函数】
- 函数.prototype = new Object()【函数除了Object外】
- 因为 Object.prototype.proto 为null
- 即 Function.prototype.proto === Object.prototype 为true
所有函数都是Function的实例(包括Function自己)
- 也就是var Fn = new Function()
- 任意函数.proto === Function.prototype 为true
Object的原型对象是原型链尽头
- Object.prototype.proto === null
原型链属性问题
读取对象的属性值时
- 会自动到原型链中查找
设置对象的属性值时
- 不会查找原型链
- 若当前对象没有这个属性,直接添加该属性到对象身上并设置属性值
方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
instanceof
instanceof是怎么判断的?
- 表达式 a instanceof B
- a是实例,B是函数
- 若B函数的显式原型对象(B.prototype)在a对象的原型链上(沿着__proto__查找),返回true,否则返回false
例子
-
Object instanceof Function
-
- true
-
Object instanceof Object
-
- true
-
Function instanceof Function
-
- true
-
Function instanceof Object
-
- true
-
function Foo() {} Object instanceof Foo
-
- false
-
所有函数都是new Function()产生的
-
- 所有函数都有__proto__指向Function.prototype\
-
函数的显示原型默认指向一个空的Object实例对象(Object函数除外)
-
- 所有函数的显式原型都有__proto__指向Object.prototype(Object函数除外)