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)
这一章不难,就是有些弯弯绕,容易看迷糊,多思考下,多敲下,有阻力,是在上坡,是在成长。