当前位置: 首页 > Web前端 > HTML

JavaScript原型链详解

时间:2023-03-28 00:15:14 HTML

最近在项目中经常遇到,经常和同事讨论关于js原型链的知识。我发现很多工作多年的同事都记不清原型链的整个环节。今天特地把链图画在这里并加以说明,希望能帮助到更多的前端朋友。原型链其实是一个三角关系。如下图所示,我们写了一个构造函数Student,通过构造函数(consts1=newStudent())创建了一个对象s1,也就是我们常说的s1就是构造函数Student实例。此时构造函数Student和实例对象s1的原型都指向Student原型对象,只是名字不同。构造函数指向原型对象的地址名为prototype,实例对象s1指向原型对象的地址名为__proto__。属性名在我们日常开发中经常见到。同时,原型对象中的构造函数指向构造函数Student。整体构成了构造函数的三角关系,那么什么是原型链呢,我们还要继续往上走,我们可以清楚的看到即使是原型对象,也永远是一个对象,它也有自己的__proto__属性(所有对象都有__proto__属性,什么是对象?typeofvariable/constant==='object'),如下图所示。Student的原型对象的__proto__属性指向了Object的原型对象,这就是为什么你平时创建的对象字面量,或者生成的实例对象都可以使用Object上的所有方法(这个原因我们会在最后重复)在同时推导我们可以知道,Object原型对象一定是Object构造函数的原型。如果后面的内容不太好理解,可以尝尝构造器->实例对象->原型对象。这个时候我们会不明白为什么Object构造函数指向Student原型对象。因为所有的对象都是通过构造函数生成的,所以在创建构造函数Student的时候,Object的构造函数同时成为了一个原型对象。这个原型对象被地址为Student的构造函数引用,并且与s1相连。当我们沿着Object原型对象继续寻找__proto__时,会发现Object原型对象的__proto__为null。如果你对下图感兴趣,可以一层层找找看。那么我们常说的原型链其实就是图中右边的__proto__关联的一条链,这条链就是原型链。这也包括继承的概念,本文不再赘述。最后说说为什么我们创建的所有对象都可以使用Object原型上的所有方法。这是因为实例对象使用的所有方法都会沿着原型链逐层往上走,直到找到第一个匹配的方法。方法,否则会报错。这也是我们需要理解原型链的意义之一。同时,我们也可以利用原型链的特性,寻找更多定制化的方法来解决我们实际的开发问题。