前端知识梳理之原型链

首先理解三个概念:

  • 构造函数 : 在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',这样就称之为原型链继承。

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

相关推荐
cwtlw3 分钟前
CSS学习记录20
前端·css·笔记·学习
界面开发小八哥8 分钟前
「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
java·前端·ide·java-ee·myeclipse
米奇妙妙wuu23 分钟前
react使用sse流实现chat大模型问答,补充css样式
前端·css·react.js
傻小胖27 分钟前
React 生命周期完整指南
前端·react.js
梦境之冢1 小时前
axios 常见的content-type、responseType有哪些?
前端·javascript·http
racerun1 小时前
vue VueResource & axios
前端·javascript·vue.js
m0_548514771 小时前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
AndrewPerfect1 小时前
xss csrf怎么预防?
前端·xss·csrf
Calm5502 小时前
Vue3:uv-upload图片上传
前端·vue.js
浮游本尊2 小时前
Nginx配置:如何在一个域名下运行两个网站
前端·javascript