JavaScript第四版阅读ing~(7)

8.2.5对象迭代
在这里插入图片描述
这种做法改变了constructor属性的指向,现在指向了Object,(相当于没有constructor,之后new Object,沿着隐式原型链周到Object的constructor属性,而这个属性指向Object)。
在这里插入图片描述

我们需要这样子,下面的意思正常给Person.prototype添加constructor属性默认是可枚举的,但是实际上这个属性是不可枚举的,所以我们采用Object.defineProperty()给其设置值:
在这里插入图片描述
在这里插入图片描述
8.3.2盗用构造函数(也称为经典继承)

思路:子类构造函数中调用父类构造函数,相当于SubType创建新对象时运行了SuperType中所有的初始化代码而已。像是在SubType中,自己写了this.colors = [“red”, “blue”, “green”]
缺点:不能访问父类方法和属性

在这里插入图片描述
8.3.3组合继承(伪经典继承)
综合了原型链和经典继承,无非就是相当于在子类构造函数中调用父类方法,之后又将父类实例化并赋值给子类构造函数的prototype(继承方法),这样组合继承。
在这里插入图片描述
在这里插入图片描述
写一下,看下内部情况。easy。

 function SuperType(name){
     this.name = name
     this.colors = ['red', 'blue']
 }
 SuperType.prototype.sayName = function(){
     console.log(this.name)
 }
 function SubType(name, age){
     SuperType.call(this,name)
     this.age = age
 }
 SubType.prototype = new SuperType()
 SubType.prototype.sayAge = function(){
     console.log(this.age)
 }
 let ins = new SubType('zz',18)
 ins.colors.push('black')
 console.log(ins) //name colors age --> sayAge name colors -->  sayName

在这里插入图片描述
在这里插入图片描述

8.3.4原型式继承(与原型模式一样)
在这里插入图片描述
在这里插入图片描述
**Object.create()**一个参数时和上面是一样的,这种方法的精髓在于函数原型被赋值为 new Object()(这里他是字面量,但是字面量相当于new Object,换汤不换药而已)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3.5寄生式继承

寄生式继承和上面原型式继承很像,只不过是返回了处理过的增强对象而已。
在这里插入图片描述
在这里插入图片描述
8.3.6寄生式组合继承

这种方式避免了组合继承的重复调用父类构造函数,就是上面组合继承那里,覆盖了第二次的值,这里目的就是调一次父类函数。
在这里插入图片描述在这里插入图片描述
试一下,这里省略了,也不算省略了组合继承中的 SubType.prototype = new SuperType(),像是找到一种代替的感觉,因为这一步操作会为SubType.prototype增加无用的属性

function object(o){
    function F(){}
    F.prototype = o
    return new F()
}
function inheritPrototype(SubType, SuperType){
    let prototype = object(SuperType.prototype)
    prototype.constructor = SubType
    SubType.prototype = prototype
}
function SuperType(name){
    this.name = name
    this.colors = ["red", "blue", "green"]
}
SuperType.prototype.sayName = function(){
    console.log(this.name)
}
function SubType(name, age){
    SuperType.call(this,name)
    this.age = age
}
inheritPrototype(SubType, SuperType)
SubType.prototype.sayAge = function(){
    console.log(this.age)
}
let a = new SubType('zz', 18)
console.log(a)

在这里插入图片描述
这一章不难,就是有些弯弯绕,容易看迷糊,多思考下,多敲下,有阻力,是在上坡,是在成长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值