学习笔记之原型+原型链

114 阅读2分钟

微信截图_20220922132950.png

  • 函数Function构造函数的实例对象

  • 对象Object构造函数的实例对象

  • Function构造函数Function构造函数的实例对象

  • Object构造函数Function构造函数的实例对象

  • 函数都存在显式原型prototype,显式原型是对象

  • 对象都存在隐式原型__proto__ ,隐式原型指向其构造函数的显式原型

一、原型

1、prototype和__proto__

  • prototype:显示原型(在js中,所有的函数都有显示原型显示原型是一个对象
  • __proto__:隐式原型(在js中,所有的对象都有隐式原型隐式原型指向该对象构造函数显示原型

2、prototype和__proto__之间的关系

  • 构造函数prototype与其实例(对象)__proto__是指向同一个地方,这个地方就叫做原型对象,也就是xxx.prototype原型对象,而__proto__是起链接作用,xxx.prototype相当于一个公共区域,可以为继承它的子代提供属性和方法

3、构造函数、函数、对象(简单的解释方便理解原型)

  • 构造函数简单的说就是可以new的函数,默认会首字母大写,(箭头函数不能用来当作构造函数)
//Animal构造函数
function Animal() {
    this.name = name
}
//Animal原型对象 
Animal.prototype = {
    id: "Animal",
    sleep: function () {
         let a = 1
         a++
         return a
    }
}
//通过new实例化一只旺财一只咪咪,
let dog = new Animal("旺财")
let cat = new Animal("咪咪")
console.log(Animal,"Animal");
console.log(dog,"dog");
console.log(cat,"cat");
  • 函数可以简单理解为通过 new Function() 实例化得到的(例如:具名函数匿名函数箭头函数)
function fn() {},
const fn = new Function() {},

const fn1 = function() {},
const fn1 = new Function() {},

const fn2 = () => {}
const fn2 = new Function() {},
  • 对象可以简单理解为通过 new Object() 实例化得到的(当然上文中旺财和咪咪也是Animal的实例化对象)
let obj = {}
let obj = new Object()

4、Function与Object

  • 需要理解FunctionObject构造函数,那么本质上还是函数,既然是函数那么它们就是由Function实例化而来的对象,所以就可以理解为什么FunctionObject同时存在prototype__proto__

二、原型链

  • 图中粉色组成的链状结构就是原型链
  • 当我们需要查找一个对象的某个属性的时候,首先会在自身属性上查找,如果没有,则会沿着就近的__proto__这个隐式原型查找,即指向它的父函数prototype,如果仍然没有找到,则会继续沿着父函数prototype属性的__proto__指向的再上一层函数中查找,这样一层一层向上形成一个链式结构。叫做原型链