欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习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.