前端与JS | 青训营笔记

18 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

今天来总结一下原型与原型链

首先清楚几个定义

构造函数:用来创建对象的函数

对象:JS的一个引用数据类型

原型

js的每个构造函数都有一个属性prototype,即显式原型对象,默认指向一个空对象

验证:

image.png

每个实例对象都有一个属性,__ proto __ ,隐式原型对象,指向构造函数的显式原型对象

验证:

image.png

这两个指针指向同一个对象

image.png

image.png

原型链

明白了原型的概念后,什么是原型链呢,就是每一个原型对象也是对象,拥有自己的__ proto __ 属性,都可以向上查找。那么能无限向上查找吗?不能,每一个对象都可以看做是由Object构造函数产生的实例对象,所以查找的尽头就是Object的prototype对象,它是终点,它的__ proto__ 指向null

image.png

那么同时每个原型对象身上都会有一个constructor属性,指向自己的构造函数

function Obj() {}

let myobj = new Obj();

console.log(Obj.prototype === myobj.__proto__);//true

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

image.png

instanceof原理

A instanceof B

语义:A是否是B的实例对象,是则返回true

原理:顺着原型链向上找,如果构造函数B的显式对象在A对象的原型链上,则返回真

如上图,person instanceof Person

构造函数B的显式对象:Person.prototype A对象的原型链:__ proto__ -》 Person.prototype-》Object.prototype-》null

在,则返回真。建议结合上图进行理解

function Obj() {}

let myobj = new Obj();

// console.log(Obj.prototype === myobj.__proto__);

// console.log(Obj === Obj.prototype.constructor);

console.log(myobj.__proto__);//{} 原型链上第一个箭头
console.log(myobj.__proto__.__proto__);//[Object: null prototype] {} 原型链上第二个箭头
console.log(myobj.__proto__.__proto__.__proto__);//null 原型链上第三个箭头
console.log(myobj.__proto__.__proto__.__proto__.__proto__);//TypeError  Cannot read properties of null (reading '__proto__')找到头了!