JS原型与原型链

所有内容均不是原创,单纯之前学习时做的笔记。内容结合了非常多的文章视频,已经记不清参考的哪里的了,所以就没有加参考说明了。

原型与原型链

  • 对应名称

    • prototype:原型
    • __proto__:很多人会理解成原型链,其实应该是原型的连接点
  • 从属关系

    • prototype 是函数的一个属性,是一个对象{}
    • __proto__ 是对象Object的一个属性,也是一个对象{}
    • 对象的__proto__ 保存着该对象的构造函数的prototype
  • function Test (){};
    console.log (Test.prototype);//{constructor: ƒ}
      
    const test = new Test();
    console.log(test.__proto__);//{constructor: ƒ}console.log(test.__proto__=== Test.prototype) ;//true// Test.prototype => {__proto__}
    console.log (Test.prototype.__proto__ === Object.prototype);//true
    console.log (Object.prototype.__proto__);//null
    

原型链

  • 沿着 __proto__ 去找原型里的属性,一层一层去继承原型里的属性的这条链条,就叫做原型链。

  • 打个比喻:protetype就是一条链上的节点,里面存放我们的信息,__proto__就是连接两个节点的绳子。

  • 原型链的顶层是 Object.prototype ,再往上就是 null

  • test = {
      b: 333
      a: 1,
      __proto__: Test.prototype = {
        b: 2,
        __proto__: Object.prototype = {
          c: 3
          __proto__: null
        }
      }
    }
    

Function与Object的特殊性

  • FunctionObject既是函数也是对象
  • Function.prototypeObject.prototype 是两个特殊的对象,他们由引擎来创建。除了以上两个特殊对象,其他对象都是通过构造器 new 出来的
  • // const Test = new Function()
    console.log(Function.__proto__ === Function.prototype);//true// const obj= f:
    // const obj= new Object(); 
    console.log(typeof Object);// function
    console.log(Object.__proto__ === Function.prototype)//true
    console.log(Object.__proto__ === Function.__proto__)//true
    

constructor

  • 原型的 constructor 属性指向构造函数,构造函数又通过 prototype 属性指回原型。
  • constructor 是实例化对象的构造函数

总结

image.png