JavaScript高级-函数(下) | 青训营笔记

71 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

函数高级之原型链

原型链

访问一个对象的属性时

  • 先在自身属性中查找,找到返回
  • 若没有,再沿着__proto__这条链向上查找,找到返回
  • 若最终没有找到,返回undefined

别名

  • 隐式原型链

作用

  • 查找对象的属性和方法

Function

  • 所有的函数,不管是自己定义的还是内置的,都是new Function()产生的。也就是说所有的函数对象都是Function的一个实例对象

  • Function.prototype === Function.proto

  • 所有函数对象的隐式原型都指向Function的显示原型

函数对象关系图

image.png

原型链关系图

image.png

最关键的一句话

实例对象的隐式原型的指向等于构造函数的显示原型

总结

函数的显式原型指向的对象:空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函数除外)

题目

image.png

image.png

image.png