学习TS时,再回头看看JS的继承
程序员文章站
2022-03-08 20:24:10
...
首先,抛开TS不讲。来看看JS的继承。
一般我们创建一个对象
let boy = {
name: '张三',
age: 19,
sayOk: function () {
console.log(this.name + "can say OK!")
}
}
boy.sayOk();
我们知道,在创建一个对象的时候,其实是内部帮我们 new object(),实际应该是这样:
function People(res) {
if (res) {//如果不加这个判断,在下面Man.prototype = new People();这一行就会报错res.name找不到
this.name = res.name;
this.age = res.age;
this.smoke = function () {
console.log("抽根烟压压惊!")
}
}
}
People.prototype.sayOk = function () {//这里还不能用箭头函数
console.log(this.name + "can say OK!")
}
var boy= new People({ name: '张三', age: 19 })
boy.sayOk();
现在,我们需要在这个对象的基础上,创建一个子对象man,这个子对象的部分属性和方法和这个boy基本类似,作为一个有精神洁癖的程序员,那么这个时候肯定需要复用代码。
function Man(result) {
People.call(this, result);//改变this指向(也叫构造函数继承)
this.sex = "男"//添加一个自己独有的属性
}
var man = new Man({ name: '张三', age: 18 });
console.log(man);
man.smoke();//说明构造函数可以直接继承父函数上面的方法
man.sayOk();//报错,构造函数不能继承原型上面的方法
这个时候就应该思考了,为什么创建的这个实例对象上面没有sayOk方法?
console.log(Man.prototype)//哦,原来这个构造函数的原型上压根就没有sayOk方法
这个时候,我们就应该改变Man的原型链,让Man的原型上也有sayOk方法。
//2.组合继承(构造函数继承+原型继承)
function Man(result) {
People.call(this, result);//改变this指向(构造函数继承)
this.sex = "男"//添加一个自己独有的属性
}
// var man = new Man({ name: '张三', age: 18 });
// console.log(man);
// man.smoke();//构造函数可以直接继承父函数上面的方法
// man.sayOk();//报错,构造函数不能继承原型上面的方法
//原型继承
Man.prototype = new People();//People的实例上必定会有sayOk方法!
Man.prototype.constructor = Man;
var man = new Man({ name: '张三', age: 18 });
man.sayOk();
让我们再来看看ES6类的继承方法,说白了,类就像是一个原型对象。
class People{
constructor(result){
this.name = result.name;
this.age = result.age;
}
sayOk(){
console.log(this.name + "can say OK!")
}
}
class Man extends People{
constructor(res){
super(res);//继承了父类的一切(属性+方法)
this.sex = this.sex || "男";
}
sayBye(){
console.log(this.name + "can say bye!")
}
}
let man = new Man({name:'李四',age:18})
console.log(man);
man.sayOk();
man.sayBye();
显而易见,还是ES6的class让继承更加明朗!
上一篇: Python(继承演练)
下一篇: Example 3-4.
推荐阅读