浅谈 JS 原型和原型链

JS 中一切皆为对象,大致分两类:普通对象(object)和函数对象(function)
除了定义的函数以外,所有的构造函数也是函数对象如 Function、Object、Number 等

  • 函数对象都有 prototype 属性,指向该函数对象的原型对象,它记录着一些属性和方法
      function Fun () {}
      Fun.prototype.name = 'Fun'
      Fun.prototype.getName = function () {}
  • 函数对象的原型对象可以让函数对象的的实例共享原型对象上的属性和方法,实现继承
      let f = new Fun()
      f.name === Fun.prototype.name
      f.getName === Fun.prototype.getName
  • 函数对象的原型对象有个 constructor 属性,指向该函数对象本身
      Fun.prototype.constructor === Fun
  • 所有对象(包括函数对象和原型对象)都有__proto__属性,指向构造函数的原型对象
      let obj = {}
      obj.__proto__ === Object.prototype
      f.__proto__ === Fun.prototype
      Fun.__proto__ === Function.prototype
      Object.__proto__ === Function.prototype
      Fun.prototype.__proto__ === Object.prototype
      Function.prototype.__proto__ === Object.prototype
      // Object.prototype.__proto__ 比较特殊,到达原型链终点
      Object.prototype.__proto__ === null
      // Function.__proto__ 比较特殊
      Function.__proto__ === Function.prototype

在使用 new 方法实例化一个函数对象的时候,得到的新对象的__proto__会指向函数对象的原型对象,如果该函数对象又继承自另一函数对象,那么该函数对象的原型对象的__proto__又指向另一函数的原型对象……最终,某一函数对象的原型对象的__proto__会指向 Object 的原型对象,而 Object 的原型对象的__proto__指向 null,整个链形成了一条原型链

除特殊说明外本人博客均属原创,转载请注明出处:http://blog.johnhan.cn/blog_1103.html
京ICP备19044523号-1