给大家创造一个媳妇儿,并让你搞懂构造函数 prototype、__proto__、constructor

99 阅读2分钟

构造函数

  • 首先我们有一个生产媳妇的车间 就是我们的构造函数
  • 他有什么用呢!=> 根据不同的需求生产出不同的媳妇儿
  function Wife ({name,age,cup}){
      this.name = name,
      this.age = age,
      this.cup = cup
  }

prototype

  • 其实很多东西不用车间单独的去生产,那些是天生的每个媳妇儿都有的
  • 当然我们也可以单独的去生产,这样就太浪费资源了。(每一个方法都会独立开辟一块空间,浪费内存)
  • 所以我们把这些统一的东西就放在 prototype
Wife.prototype = {
    constructor: Wife, // 生产地址 让大家知道这媳妇儿是那个车间生产出来的(指向回构造函数)
    anger: function(){
      console.log('气死我了')
      this.buyABagBag()
    },
    buyABagBag: function(){
      console.log('买个包包')
    },
 }
  • 工厂有了让我们去生产一个媳妇儿波 const myWife = new Wife({name:'XXX', age:18, cup: 'D'})
  • 来看看我的媳妇儿,并且给大家表演个生气 console.log('myWife', myWife) myWife.anger() image.png

console.log(myWife.__proto__ === Wife.prototype) //true console.log(myWife.constructor === Wife) //true

  • 总结:

原形

  1. 每一个实例对象都有一个__proto__ 他指向构造函数的 prototype,
  2. 实例的constructor指向 原构造函数

原型链

  • 因为 prototype 也是一个函数,它是由 Object创建出来的,
  • 所以 prototype.constructor 指向他的原函数 Object, prototyped.__proto__ 指向 Object的 prototype
  • Object.prototype.__proto__ 就是null了
  • Object有toString方法,因为有原形链的存在,所以我的媳妇儿也可以使用 toString
  • 原形链的查找规则:先从自己身上找,如果没有就去__proto__上找,如果没有,再去下一级的__proto__上找,如果一直找到Object的__proto__ 上都没有,那么就是un

继承

  • 媳妇儿的妈妈 是个厨师,我想让媳妇儿拥有做饭的能力,就用到了继承
//这是丈母娘的能力
function WifeMother(){
  this.chef = function(food){
    console.log('亲爱的这是你想吃的' + food)
  }
}
// 每个妈妈都会的能力
WifeMother.prototype.laundry = function(){
  console.log('衣服洗好了')
}
// 媳妇儿继承能力
function Wife ({name,age,cup}){
  this.name = name,
  this.age = age,
  this.cup = cup
  WifeMother.call(this) //运用call来继承
}
const myWife = new Wife({age:18,name:'xxx',cup:'D'})

// 1.现在媳妇儿就有了做饭的能力 
myWife.chef('蛋炒饭') // 亲爱的这是你想吃的蛋炒饭
myWife.laundry() // 媳妇儿并不会洗衣服

// 2.怎么继承原形上的方法呢?
const wifeMother = new WifeMother()
Wife.prototype.laundry = wifeMother.laundry
myWife.laundry() // 衣服洗好了

ES6 Class

class 本质上就是构造函数 只不过是给你提供了一个更便捷的写法 => 我们称它为语法糖 他的prototype、__proto__、constructor,跟构造函数完全一样

class WifeMother {
    constructor({name,age}){
      this.name = name + '母亲',
      this.age = age + '母亲'
    }
    chef(foot){
      console.log(foot)
    }
}
class MyWife extends Father {
    constructor({name,age}){
      super({name,age}) // 调用父元素的constructor
      console.log(this.name + this.age) //xx母亲18母亲,可以调用母亲的属性
    }
    buy(bag){
      console.log(bag)
    }
}

const wifeMother = new WifeMother({name:'xx', age: '18'})
const myWife = new MyWife({name:'xx', age: '18'})
wifeMother.chef('炒鸡蛋')
myWife.buy('LV')
myWife.chef('西红柿') // 我媳妇就继承了做饭的能力