ES5的继承
构造函数的继承
基本思想:在子类型构造函数的内部调用超类型构造函数,通过使用apply()和call()方法可以在将来新创建的对象上执行构造函数
// 构造函数
// 构造函数
function Person(name, sex) {
this.name = name;
this.sex = sex;
this.niam= "草拟吗"
this.run=function(){
console.log(this.name+"在奔跑")
}
}
// 定义Person的原型,原型中的属性可以被自定义对象引用
Person.prototype = {
getName: function() {
return this.name;
},
getSex: function() {
return this.sex;
}
}
// Subperson.prototype = new Person()
function Subperson(name, sex, color){
Person.call(this, name, sex)
this.color = color
this.niam= "你阿妈"
this.jump=function(){
console.log(this.name+"---"+this.color+"还活蹦乱跳")
}
}
let sub = new Subperson("小李","男","黑色的");
//console.log(sub.getName()) //这里会报错 sub.getName is not a function
sub.run()
sub.jump()
$ node es5继承.js
ZhangSan在奔跑
ZhangSan---黄色的还活蹦乱跳
ChunHua在奔跑
ChunHua---白色的还活蹦乱跳
小李在奔跑
小李---黑色的还活蹦乱跳
继承父类后,子类无法使用父类原型上的方法( getName ),只能使用父类构造函数里的方法(run)
通过call或者apply方法,我们实际上是在将来新创建的SubType实例的环境下调用了SuperType构造函数。这样一来,就会在新SubType对象上执行SuperType函数中定义的所有对象初始化代码,因此,每一个SubType的实例都会有自己的colors对象的副本
- 优点
- 传递参数
- 缺点:
方法都在构造函数中定义,函数无法复用
在超类型中定义的方法,子类型不可见,结果所有类型都只能使用构造函数模式