网站首页 > 技术文章 正文
关于原型和原型链的问题,在前端面试中,是经常被问到的,是最高频率问题之一,那么什么是原型和原型链呢?
下面是自己整理的关于原型和原型链知识的简单记录。
什么是原型(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过程经历了哪些步骤呢?主要是三个步骤:
- 实例化一个空的person1对象:var person1= {};(则person1具有__proto__属性)。
- 将person1.__proto__属性指向了其构造函数Person的prototype属性(即prototype对象) 等同于 person1.__proto__= Person.prototype 。
- 构造函数类似于调用call或apply方法改变了Person中this指向,使其指向了person1,最后返回person1。
从上面分析可知,person1通过其__proto__属性指向了Person的prototype属性,这样我们实现了person1对Person的继承。
所以可以说,把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链。原型链实际上就是js中数据继承的继承链。如图所示
下面是网上的一张关于原型链的经典图片,这图很好的说明了。
猜你喜欢
- 2024-11-10 这样理解 JS 原型链,通透 js原型链的理解
- 2024-11-10 JavaScript-原型链 javascript 原型,原型链 ? 有什么特点?
- 2024-11-10 javascript原型链 js原型链的用处
- 2024-11-10 js 原型/原型链/构造函数/实例/继承
- 2024-11-10 【JavaScript 高级】深入了解原型链
- 2024-11-10 快速读懂JavaScript中的原型链 js的原型和原型链是什么
- 2024-11-10 你可能不太理解的JavaScript - 原型与原型链
- 2024-11-10 我在jacascript中学习到的那些原型链,你知道吗?
- 2024-11-10 JavaScript中的原型prototype和__proto__的区别及原型链概念
- 2024-11-10 面试问题分享 - 5:解释一下 原型、构造函、实例、原型链 之间的关系
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-