再学——图解原型链

初始知识点

prototype与constructor

构造函数与它的原型对象有相互引用的关系

什么是相互引用?
构造函数中有属性prototype可以找到原型对象,原型对象中有属性constructor可以找到构造函数。

在这里插入图片描述

prototype与__proto__

对象的隐式原型的值为其构造函数的显式原型的值

  • 函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象。
  • 对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值。
        function Fn() {}
        console.log(Fn.prototype)
        var fn = new Fn()
        console.log(fn.__proto__)
        console.log(fn.__proto__ === Fn.prototype) //true

原型的属性与方法

  1. 读取对象的属性时:会自动在原型链中查找
  2. 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
  3. 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上

(隐式)原型链

  • 原型链又名(隐式原型链),它的作用是查找对象属性(方法)
    (原型链查找对象属性、作用域链查找变量)
  • 访问一个对象的属性时:
  1. 先在自身属性中查找,找到返回
  2. 如果没有,再沿__proto__这条链向上查找,找到返回
  3. 如果最终没钟爱到,返回undefined

图解原型链

在这里插入图片描述

如上图所示是关于原型链的图解,我将按照图示的顺序来对原型链进行理解

  1. JS引擎在加载页面时首先会把内置的一些函数加载进来,接着再去执行代码。而Object即为其中的一个内置对象。
    此时序号1虚线意思的:o1和o2为Object的两个实例对象,对象的隐式原型的值为其构造函数显式原型的值。
  2. 所有的函数都是Function的实例,包括Function自己也是自己的实例。即所有函数的__proto__都是一样的,都等于Function.prototype。
      var Foo = new Function()
      console.log(Foo.__proto__ === Function.prototype) //true
  1. 函数的显式原型指向的对象默认是空Object实例对象,但Object的显式原型不满足。
        function Fn() {}
        console.log(Fn.prototype.__proto__ === Object.prototype) //true
  1. Object的原型对象是原型链尽头
        console.log(Object.prototype.__proto__) //null

若有错误欢迎指正!

猜你喜欢

转载自blog.csdn.net/xicc1112/article/details/105856442