JavaScript的三座大山--原型和原型链

200 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

前言:

了解和学习前端的小伙伴肯定会听过JavaScript基础的三座大山,分别是作用域和闭包,原型和原型链,异步和单线程。本文主要是了解构造函数、实例化对象、原型对象和原型链。

构造函数

构造函数和普通函数本质上没什么区别,只不过使用了new关键字创建对象的函数,被叫做了构造函数

内置函数

ECMAScript核心语法自带内置构造函数: 有一部分内置构造函数:Function、 Object、 Array、 String、 Number、 Boolean、 RegExp、 Error、 Date

实例化对象

构造函数用new关键字创造的对象

new关键字的四个流程

(1)创建空对象

(2)this指向这个对象

(3)对象赋值

(4)返回对象

举个例子:

function Person (name, age, sex) {
        //(1)创建空对象  {}
        //(2)将this指向这个对象  this = {}
        //(3)对象赋值
        this.name = name
        this.age = age
        this.sex = sex
        //(4)返回这个对象  return this
      }
//创建三个实例化对象
      let person1 = new Person('库里', 34, '男')
      let person2 = new Person('詹姆斯', 38, '男')
      let person3 = new Person('科比', 42, '男')
      console.log(person1, person2, person3)

prototype属性和原型对象

每一个构造函数都有一个名为 prototype 的属性,译成中文是原型的意思,这个prototype 的属性指向构造函数在被创建的时候,系统都自动帮我们创建一个与之对应的对象,称之为原型对象

每个函数都有 prototype 属性 (原型对象 = 函数.prototype)

原型对象具体的作用

既然原型是一个对象 : 用于存储数据

例:

function Person() {
    // 此处未定义任何方法
  }

  // 为构造函数的原型对象添加方法
  Person.prototype.sayHi = function () {
    console.log('勇士总冠军');
  }
  Person.prototype.sayHi()// 输出结果为 勇士总冠军	
  // 实例化
  let p1 = new Person();
  p1.sayHi(); // 输出结果为 勇士总冠军

如上:

谁可以访问 原型中的成员(属性+方法)

    a. 构造函数自身 : 构造函数名.prototype
    b. 这个构造函数所创建(实例化)的每一个对象
    

__ proto __ 属性

__ proto __ 属性属于对象,指向实例化这个对象的构造函数对应的原型,为了方便查看一个对象的原型

(实例化对象.__ proto __ === 原型对象 )

__proto__不是ECMA标准语法,有一些浏览器不支持,开发中不推荐使用

constructor属性

constructor属性属于原型对象,指向该原型的实例的构造函数,可以得知某个实例对象,到底是由哪一个构造函数生成的

(原型对象.constructor === 构造函数)

小结

画个图:

image.png

原型链

每一个对象,都有__proto__属性指向自身的原型。 而原型也是对象,也有自己的 __proto__属性指向原型的原型,以此类推形成链式结构,称之为原型链

原型对象的__proto__属性指向内置函数Object的原型对象

原型链终点 : null

如图:

image.png

image.png