_proto_和prototype的关系以及区别

_proto_是服务于函数对象的,prototype是服务于构造函数的实例化对象的

_proto_和prototype的关系以及区别_第1张图片

_proto_和prototype的关系以及区别_第2张图片

js的函数会有一个默认的prototype对象,这个prototype对象用来指定函数的继承关系,prototype对象默认有两个属性,一个是constructor,另一个就是proto属性,默认的prototype对象在被改变之前就像是这个函数用来表示自己的一个对象,其中proto属性和普通对象的proto属性一样用来对应继承关系

总结

  • 原型链的形成真正是靠__proto__ 而非prototype,当JS引擎执行对象的方法时,先查找对象本身是否存在该方法,如果不存在,会在原型链上查找,但不会查找自身的prototype。

  • 一个对象的 proto 记录着自己的原型链,决定了自身的数据类型,改变 proto 就等于改变对象的数据类型。

  • 函数的 prototype
    不属于自身的原型链,它是创建子类的核心,决定了子类的数据类型,是连接子类原型链的桥梁。
    在原型对象上定义方法和属性,是为了被子类继承和使用。

  • 改变原型跟this指向没有关系,例如:

let obj = {
    name: 'han'
  }  
  let tem2 = {
    name: '韩',
    show: function() {
      console.log(this.name);
    }
  }
  Object.setPrototypeOf(obj,tem2)
  console.log(obj.show());//输出han,此时虽然obj原型是tem2并且调用的是来自于tem2的show方法,但此时this还是指向调用者obj

你可能感兴趣的:(JS)