持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
什么是原型和原型链?这个问题在我们学习JavaScript和面试准备过程中是必不可少的,今天我们就来看看。
每个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。函数的 prototype 属性指向了关联对象,普通对象通过**__proto__**指向该对象的原型。
为什么需要原型和原型链?
为了实现其他语言的“继承”功能,而继承意味着复制操作,然而 JavaScript 默认并不会复制对象的属性,相反,JavaScript 只是在两个对象之间创建一个关联,这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确些。 — 引自《你不知道的JavaScript》
这也是为什么我们创建了一个对象后,能够访问到很多我们没有定义的属性和方法的原因。会通过__proto__属性查找它的原型链,在原型对象上查找,找到了就返回,直至最顶层。画一张图来看看吧
然后我们根据这张图来详细说说几个概念吧
构造函数
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
参考文章: