开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天
前言
我想很多初学前端的小伙伴们在学习js的原型链的时候一知半解,经常被绕晕吧。理解js中原型和原型链的概念,绝对是帮助我们深入学习js至关重要的一步。那么怎样学习原型链呢?我会用最通俗易懂的文字带你逐个击破,你会发现原型链原来如此简单!
原型的理解
很重要的要理解噢~
- 原型是什么?原型(prototype)是函数对象的一个属性,在js声明构造函数时,会在内存中创建一个对应的对象,这个对象就是原函数的原型。通过构造函数实例化出来的所有对象,都可以继承该原型对象的属性。
- 构造函数又是什么呢?构造函数主要用来创建对象时初始化对象,他和普通函数的区别就在这,同时构造函数的首字母要大写。
- 构造函数默认有一个prototype属性,prototype的值指向该函数的原型。原型也有一个constructor属性,并且constructor的值指向函数对象。通过构造函数实例化出来的对象并不具有prototype属性,但是会默认有一个__proto__属性(是__不是_哦~),__proto__的值指向构造函数的原型。
> 小伙伴们可能会有一点点绕,那么用图来直观的感受一下吧!
- 原型的作用,第一点,可以节约内存空间;第二点,可以实现继承。
看看下面的代码理解一下咯
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。这种不断一级一级往上查找,把原型连成链状的就叫原型链。
> 再来一个完整一点的图片,让你们更好的理解一下吧!
> 如果能看懂下面的等式,说明你基本掌握啦!
结语
第一次在掘金里发技术类的文章,希望可以和各位一起交流一下学习方法、共同进步。由于第一次写,肯定或多或少都有没有讲解到位的地方,欢迎各位在评论区里交流指正!