你还在对javascript中的原型和原型链一知半解?(有图方便理解)

194 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天

前言

我想很多初学前端的小伙伴们在学习js的原型链的时候一知半解,经常被绕晕吧。理解js中原型和原型链的概念,绝对是帮助我们深入学习js至关重要的一步。那么怎样学习原型链呢?我会用最通俗易懂的文字带你逐个击破,你会发现原型链原来如此简单!

原型的理解

很重要的要理解噢~

  • 原型是什么?原型(prototype)是函数对象的一个属性,在js声明构造函数时,会在内存中创建一个对应的对象,这个对象就是原函数的原型。通过构造函数实例化出来的所有对象,都可以继承该原型对象的属性。
  • 构造函数又是什么呢?构造函数主要用来创建对象时初始化对象,他和普通函数的区别就在这,同时构造函数的首字母要大写。
  • 构造函数默认有一个prototype属性,prototype的值指向该函数的原型。原型也有一个constructor属性,并且constructor的值指向函数对象。通过构造函数实例化出来的对象并不具有prototype属性,但是会默认有一个__proto__属性(是__不是_哦~),__proto__的值指向构造函数的原型。

> 小伙伴们可能会有一点点绕,那么用图来直观的感受一下吧!

image.png

  • 原型的作用,第一点,可以节约内存空间;第二点,可以实现继承。

看看下面的代码理解一下咯

function Person(){
    this.sayHi = function(){
        console.log("你好,我是奥特曼");
    }
}

let atm = new Person();
atm.sayHi();

像这样每实例化一个对象,都会在内存中开辟一个空间给sayHi方法,导致占用内存过大。但是在prototype里创建这个方法,就不用每次都占用内存,因为所有实例化出来的对象都能够继承到prototype里的属性和方法。如下图代码所示:

function Person(){
   
}
Person.prototype.sayHi = function(){
    console.log("你好,我是奥特曼");
}

let atm = new Person();
atm.sayHi();

原型链的理解

同样很重要噢~

  • 原型链是什么?原型链是当在构造函数实例化出来的对象中访问一个属性时,最先在自身属性里开始查找,如果没有找到的话,就会通__proto__指向的原型(prototype)中去查找是否有这个属性。如果仍然没有找到,那么就会继续通过原型里的__proto__指向的上一个原型中查找。以此类推,直到找到要找的属性或者Object.prototype.__proto__为止,并且Object.prototype.__proto__的值为null。这种不断一级一级往上查找,把原型连成链状的就叫原型链。

> 再来一个完整一点的图片,让你们更好的理解一下吧!

image.png

> 如果能看懂下面的等式,说明你基本掌握啦!

image.png

结语

第一次在掘金里发技术类的文章,希望可以和各位一起交流一下学习方法、共同进步。由于第一次写,肯定或多或少都有没有讲解到位的地方,欢迎各位在评论区里交流指正!