前端知识梳理之原型链

首先理解三个概念:

  • 构造函数 : 在js中可以用new关键字来调用的函数称为构造函数,首字母一般是大写。通俗的也可以理解成你自己声明的函数如:

javascript 复制代码
  -//我是构造函数Students
  
  function Students(name, age){
      this.name = name
      this.age = age
      this.say = function(){
          console.log('我叫'+this.name+',我今年'+this.age +'岁')
      }
  }
  • 原型对象 :在你声明了一个Students函数之后,浏览器会自动按照一定的规则创建一个对象,这个对象就叫做你声明的这个函数Students的原型对象,我们给这个对象取个名字叫StudentObject

  • 函数实例:实例 就可理解成实际的一个例子,就是你给声明的构造函数调用new方法后得到的结果。例如: let stu = new Students('小明', 3) 这个 stu就是实例。

当你声明了一个构造函数后,此时,这个构造函数中会自动产生一个隐藏的属性prototype指向这个构造函数的原型。 即:Students.prototype = StudentObject。原型对象中则有一个属性constructorconstructor属性,用于记录实例是由哪个构造函数创建),这个属性指向的是这个构造函数(你声明的函数),即 StudentObject.constructor = Students,我们把他们的关系整理一下就可以得到下面这个关系图:

然后我们再加入实例,实例是怎么创造的我们已经知道了(即给构造函数调用new方法),那么实例和原型对象又有什么关系呢?这里我们需要再了解一个知识点:

  1. js分为「函数对象」和「普通对象」,每个对象都有__proto__属性,但是只有函数对象且「非箭头函数」才有prototype属性。

  2. __proto__属性是一个隐式属性,指向的是它的构造函数的原型 ,如: let a = new Object(); 那么 a.__proto__ = Object.prototype,注意这里是Object.prototype.

运用到我们的案例中,就可以知道 stu.__proto__ === StudentsObject,然后我们再把我们的关系图修改一下:

在通过对象访问属性时,会按照这个属性的名称开始搜索。搜索开始于对象实例本身。如果在这个实例上发现了给定的名称,则返回该名称对应的值。如果没有找到这个属性,则搜索会沿着指针(就是沿着__proto__属性)进入原型对象,然后在原型对象上找到属性后,再返回对应的值。

假如我们现在的原型对象StudentsObject又是另外的一个构造函数的实例,即 let StudentsObject = new Boyobject();

即:

ini 复制代码
`function BoyObject (){
};

BoyObject.prototype.sex = 'BOY'
let StudentObject = new Boyobject()
`

那么当我们的实例stu调用sex属性的时候,即stu.sex 。stu自己本身没有sex属性,就会沿着__proto__去找它的原型StudentsObject,而StudentsObject上也没有sex属性,则接着找StudentsObject的原型,即BoyObject.prototype,此时BoyObject.prototypesex 属性值为 'BOY',找到了就返回给stu.sex,最后我们调用stu.sex 得到的值就是'BOY',这样就称之为原型链继承。

多个构造函数、实例、原型对象之间按照这种规则方式的组成就是原型链

相关推荐
前端啊龙1 分钟前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
一颗松鼠5 分钟前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
小远yyds25 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
吕彬-前端1 小时前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱1 小时前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai2 小时前
uniapp
前端·javascript·vue.js·uni-app
bysking2 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓3 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4113 小时前
无网络安装ionic和运行
前端·npm
理想不理想v3 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试