js什么是原型?什么是原型链?

165 阅读2分钟

「这是我参与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,在此谢谢大佬

image.png

总结

原型和原型链是面试中的常问问题,一定牢记于心,温故而知新,没事还得多看看,毕竟我目前的项目中不常用到,加油,gogogo