编程技术文章分享与教程

网站首页 > 技术文章 正文

JS经典面试问题之原型和原型链,你会了么?

hmc789 2024-11-10 10:33:36 技术文章 2 ℃

关于原型和原型链的问题,在前端面试中,是经常被问到的,是最高频率问题之一,那么什么是原型和原型链呢?

下面是自己整理的关于原型和原型链知识的简单记录。

什么是原型(prototype)和原型链?

这里借用了《JavaScript权威指南》上的关于原型的解释来说明

原型: 每一个JavaScript对象(除null外)都和另一个对象相关联,这个另一个对象就是我们熟知的“原型”(prototype),每个对象都从原型继承属性。

原型链呢?,其实也很好理解,我们知道原型是和另一个对象相关联,那么关联起来的这一系列链条就可以称为原型链

更专业解释就是指一系列链接的原型对象的链称为“原型链”(prototype chain)。

因为在JS中,每个对象都有一个指向它的原型(prototype)对象的内部链接,这个原型对象又有自己的原型,层层向上直到一个对象的原型为null为止,这就组成了原型链,null没有原型,所以它是原型链中的最后一环节。


我们从上面的描述可以得知,其实:

1、原型也是一个对象。

2、对象通过原型链的方式实现了相关联(即我们常称作原型链的方式实现了继承)。

每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

下面通过一个示例代码来加深理解和说明:

Person 就是一个构造函数,使用 new 创建了一个实例对象 person1, Person是person1的原型,所以person1实例继承了原型上的say()方法和name属性。

注: 每个构造函数都有一个prototype属性,该prototype属性指向一个prototype对象,而这个prototype对象中保存着构造函数的原型属性和一个constructor属性,该constructor属性又指向了构造函数Person本身,我们打印一下Person.prototype,如图:


其中__proto__是浏览器提供的访问其原型对象的属性(每个对象都具有)。

constructor属性指向了构造函数本身。

那么,我们代码中的new Person() 的new过程经历了哪些步骤呢?主要是三个步骤:

  1. 实例化一个空的person1对象:var person1= {};(则person1具有__proto__属性)。
  2. 将person1.__proto__属性指向了其构造函数Person的prototype属性(即prototype对象) 等同于 person1.__proto__= Person.prototype 。
  3. 构造函数类似于调用call或apply方法改变了Person中this指向,使其指向了person1,最后返回person1。

从上面分析可知,person1通过其__proto__属性指向了Person的prototype属性,这样我们实现了person1对Person的继承。

所以可以说,把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链。原型链实际上就是js中数据继承的继承链。如图所示

下面是网上的一张关于原型链的经典图片,这图很好的说明了。


标签列表
最新留言