prototype、__proto__、constructor的关系

124 阅读1分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

前言

大家好,我是cv竹叶,原型链中的prototype、__proto__、constructor经常把人绕晕,不知道他们之间的关系,这次就让我们一起来理顺他们!!!

之间关系

prototype

因为prototype只存在于函数中,所以我们先定义一个函数Person():

function Person(){

}//定义函数,因为只有函数才有prototype属性
console.log(Person.prototype)

proto

因为每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__。所以我们得新建一个对象:

var person = new Person();//新建一个实例对象person
console.log(person.__proto__)

__proto__prototype的关系

通过上面的打印,我们可以看出__proto__prototype的关系是相等的:

function Person(){}
var person = new Person();
console.log(Person.prototype===person.__proto__);//true

子级的__proto__总会等于父级的prototype,以此类推! image.png

constructor

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

constructor和prototype的关系

构造函数Person,由实例原型Person.prototypeconstructor指向

function Person(){}
var person = new Person();
console.log(Person === Person.prototype.constructor); // true
console.log(person.constructor === Person.prototype.constructor);//true

原型链

原型链查找,当函数对象内需要寻找一个方法属性时,会在当前区域寻找,没有找到,则会往父级的区域寻找,再没有寻找到,最后会往顶部Object对象中寻找(例如函数方法里没定义toString()方法,但还是可以调用到该方法),最终会停止于Object.prototype。

Person到Object对象的原型链,他们之间prototype、__proto__、constructor的关系图如下:

image.png

结言

这就是prototype、__proto__、constructor的关系详解了,明白了这些概念之后,再也不怕面试官问到原型链的问题了!如果有帮助,就点个赞吧!