前端知识梳理之原型链

首先理解三个概念:

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

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

相关推荐
IT女孩儿1 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡2 小时前
commitlint校验git提交信息
前端
虾球xz2 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇2 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒2 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员3 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐3 小时前
前端图像处理(一)
前端
程序猿阿伟3 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒3 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪3 小时前
AJAX的基本使用
前端·javascript·ajax