原型链是什么?

  • 只有函数才有prototype属性
  • 函数的prototype属性是一个有constructor方法的对象,且这个对象的constructor方法指向函数本身
  • 实例对象的proto对象指向其构造函数的prototype属性
  1. function Student(name){
  2. this.name=name;
  3. }
  4. const s1 = new Student('jack');
  5. s1._proto_ === Student.prototype //true
  6. Student.prototype.constructor === Student // true

根据最新的ES语法,应避免使用proto属性,应使用Object.setPrototypeOf(target)、Object.getPrototypeOf(target)来替代。

构造函数或者new做了什么?

  • 创建一个全新的对象
  • 将对象的proto指向构造函数的prototype
  • 将this绑定到新创建的对象上

我们称这个新的对象为这个函数的实例。

原型链

  • instanceof: 用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
  • isPrototypeOf:测试一个对象是否存在于另一个对象的原型链上
  • 原型链的终点:Object.prototype 为null
  • 查找自身的属性,禁止查询原型链:xxx.hasOwnProperty(‘xxx’)