【JS】原型和原型链

47 阅读1分钟

前置知识

  1. 每个函数都有一个原型(对象) prototype

  2. 每个对象都有一个属性 __proto__ 指向其构造函数的原型对象 prototype

    注意:原型对象也是对象,也会有 __proto__ 属性指向它构造函数的原型对象 prototype

  3. 每个原型对象都有一个属性 constructor 指向构造函数

关键点:只要分清它是函数还是对象,它除了是函数之外,还会是谁的实例对象。比如说,构造函数虽然是函数,有自己的 prototype,但它也是 Function 的对象,会有 __proto__,指向 Function.prototype

原型链

9c606b74a1e2d9b5791c56b91c840ad.jpg

new 干了什么?

  • 创建一个独立内存空间的空对象
  • 把这个对象的构造原型(__proto__)指向函数的原型对象prototype,并绑定this
  • 执行构造函数里的代码
  • 如果构造函数有 return 就返回 return 的值,如果没有就自动返回空对象也就是this

如果构造函数返回的是引用类型的对象,则会直接返回这个对象,而不是创建一个新实例对象,所以构造函数里面最好不要返回引用类型的对象,返回基本类型不影响

function Person(name){
    this.name = name
    console.log(this) // { name: '沐华' }
    return { age: 18 }
}
const p = new Person('沐华')
console.log(p) // { age: 18 }