「这是我参与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,以此类推!
constructor
每一个原型都有一个 constructor 属性指向关联的构造函数。
constructor和prototype的关系
构造函数Person
,由实例原型Person.prototype
的constructor
指向
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
的关系图如下:
结言
这就是prototype、__proto__、constructor
的关系详解了,明白了这些概念之后,再也不怕面试官问到原型链的问题了!如果有帮助,就点个赞吧!