构造函数
- 首先我们有一个生产媳妇的车间 就是我们的构造函数
- 他有什么用呢!=> 根据不同的需求生产出不同的媳妇儿
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()
console.log(myWife.__proto__ === Wife.prototype) //true
console.log(myWife.constructor === Wife) //true
- 总结:
原形
- 每一个实例对象都有一个__proto__ 他指向构造函数的 prototype,
- 实例的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('西红柿') // 我媳妇就继承了做饭的能力