JavaScript基础篇(二):原型和原型链

128 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

什么是原型和原型链?这个问题在我们学习JavaScript和面试准备过程中是必不可少的,今天我们就来看看。

每个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。函数的 prototype 属性指向了关联对象,普通对象通过**__proto__**指向该对象的原型

为什么需要原型和原型链?

为了实现其他语言的“继承”功能,而继承意味着复制操作,然而 JavaScript 默认并不会复制对象的属性,相反,JavaScript 只是在两个对象之间创建一个关联,这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确些。 — 引自《你不知道的JavaScript》

这也是为什么我们创建了一个对象后,能够访问到很多我们没有定义的属性和方法的原因。会通过__proto__属性查找它的原型链,在原型对象上查找,找到了就返回,直至最顶层。画一张图来看看吧

image.png

然后我们根据这张图来详细说说几个概念吧

构造函数

function Person() { }
var person = new Person();

在ES6以前是没有Class类这个概念的,我们想创建一个实例就是通过new 一个构造函数来实现的。构造函数名称首字母大写

prototype

prototype属性是只有函数对象才有的,他指向了一个对象,这个对象是调用该构造函数而创建的实例的原型对象,也就是person的原型。

__proto__属性

每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型

console.log(person.__proto__ === Person.prototype); // true

constructor

每个原型都有一个 constructor 属性指向关联的构造函数。

console.log(Person === Person.prototype.constructor); // true

参考文章:

github.com/mqyqingfeng…

juejin.cn/post/689071…