「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
前言
开工第一天,趁着不忙来总结复习一下js的原型和原型链到底是什么,增加记忆,备战提桶
原型
到底什么是原型呢?原型可以理解为对象在创建时所关联的一个对象,每一个对象都会从原型继承(这里的继承只是看似继承,并不是真正意义上的继承)属性。
每一个函数都有prototype属性,函数.prototype指向一个对象
function animal(){
}
var dog = new animal()
//animal可以理解为构造函数
//animal.prototype指向一个对象,这个对象就是调用构造函数而创建的实例原型,也就是dog.__proto__
_ proto_
上文中提到了实例对象dog和构造函数animal,如果要表示两者之间的关系就要用到_ proto_ 属性,这是每个对象都有的属性,这个属性指向该对象的原型
function animal(){}
var dog = new animal()
console.log(dog.__proto__===animal.prototype) //true
由此我们可以知道构造函数和实例对象都可以指向原型,同时原型也指向着构造函数,通过constructor指向构造函数
function animal(){}
console.log(animal.prototype.constructor===animal)//true
对象除了可以通过对象._ _proto__来获得原型,也可以通过es5中的Object.getPrototypeOf()来得到原型
function animal(){}
var dog = new animal()
console.log(dog.__proto__===Object.getprototypeOf(dog))//true
注意:如果一个属性在对象上找不到就会去原型上找,如果原型上还找不到就往原型的原型上找,也就是原型._ proto_,直到找到的结果为null还没找到结束,这就是传说中的原型链。原型对象是通过Object构造函数生成的,所以有以下代码
console.log(Object.prototype.__proto__===null)//true
null的意思是“没有对象”,当Object.prototype.__proto__为null就是说Object.prototype没有原型,所以属性查找就到此为止
下面搞个关系图方便记忆,此图和文章内容参考mqyqingfeng大佬的blog,在此谢谢大佬
总结
原型和原型链是面试中的常问问题,一定牢记于心,温故而知新,没事还得多看看,毕竟我目前的项目中不常用到,加油,gogogo