关于原型链

45 阅读2分钟

什么是原型链

每个对象都会在其内部初始化一个属性,就是 proto ,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去自己的 proto 里找这个属性,也就是自己的父级原型,这个 proto 又会有自己的_proto_,于是就这样一直找下去,也就是我们平时所说的原型链。按照标准, proto 是不对外公开的,也就是说,proto 是个私有属性.

举个栗子

    function fn(initAnimal){
      this.animal = initAnimal//该属性为 实例属性 每个实例自身都有 不共享 内容不同
      }
      fn.prototype.sayMyAnimal =function(){//该方法为原型属性 每个实例对象共享 内容一样
      console.log(`我的动物是${this.animal}`)
      }
      let f1 = new fn('老虎')
      let f2 = new fn('狮子')
      f1.sayMyAnimal()//我的动物是老虎
      console.log(f2.animal)//狮子
      console.log(f1._proto_ === fn.prototype)true

更深层次的面试题

function Animal(name) {
  this.name = name;
}
Animal.prototype.data = { height: 30 };

let animal1 = new Animal('猫子');
let animal2 = new Animal('狮子');


A. `Animal.prototype.__proto__ === Function.prototype`
B. `Animal.prototype.__proto__ === Object.prototype`
C. `Object.__proto__ === Function.prototype`
D. `Function.__proto__ === Object.prototype`
E. `animal1.data === animal2.data`

首先 这道题选择 BCE

  • A应为
Animal.prototype._proto == Object.prototype
  • D应为
Function._proto_ == Function.prototype

值得一提的内容

感觉是这块知识的终点了

Object._proto_ == Function.prototype//构造函数的原型是Function的原型对象
Function._proto_ == Function.prototype//同上
Function.prototype._proto_ == Object.prototype//Function的原型对象的原型是Object的原型对象
Objcet.prototype._proto_ == null//Objcet的原型对象的原型是null 这也是常说的顶端了

总结就是

  • 原型对象的原型 就是Object的原型对象。
  • 但如果是Object的原型对象的原型 那就是null。
  • 构造函数的原型 那就是Function的原型对象。
  • 同样,Function的原型 是Function的原型对象

!TODO:有点绕 我也是查了好几处才明白 欢迎指出错误 感觉这种问题只有面试会用到

  • 有错误请指出 欢迎评论区讨论~