JavaScript 学习笔记(7)--Object Oriented

目录

继承

Private and Protected

枚举


继承

之前在ES6中没有太多的介绍继承和多态,因为理解起来还是很简单的:

class Programmer extends Person{
    private hair:boolean;
    constructor(firstName, lastName, hair:boolean){
        super(firstName,lastName );
        this.hair = hair;
    }

    displayName(): string {
        return "changed"
    }

    displayOldName(){
        return super.displayName()
    }
}

这是对JavaScript 学习笔记(7)--TS初见中Person对象的一个继承,和ES6是一样的,在写之前忽然忘记了构造函数怎么继承了,这里贴出来就当复习一下。多态的话不再详细展开,上述代码中去除private声明的话,我们声明一个对象:

let Asen: Person = new Programmer('Asen','Wang', false);
console.log(Asen.hair);

会爆出如下错误,但如果没有添加hair属性,或者不输出hair,我们发现Asen是可以设定为Person类型的。 

Error:(42, 18) TS2339: Property 'hair' does not exist on type 'Person'.

Private and Protected

这方面是在学习JS时我没有认真对待的一部分。

let Asen: Person = new Programmer('Asen','Wang', false); 
console.log(Asen.hair)

上述代码会报错:

Error:(42, 18) TS2341: Property 'hair' is private and only accessible within class 'Programmer'.

这样如果我们想去调用私有属性,需要写一个公共方法。

printPrivateHair(){
        console.log(this.hair);
    }

这时我们可以得到私有属性中的方法,但是需要注意的是,对于子类新创建的方法,我们是没有办法传递私有属性的。

Asen.printPrivateHair();

C:\Users\...\WebstormProjects\TypeScript\TS1>node object.js
false

这就要引申出protected修饰,在很多语言中,protected修饰的值在子类中是可以直接打印出来的,但是在TS中是不允许的,它和private一样只能使用公共方法调用。那么这两着有什么区别呢?

class Person {
    private readonly firstName: string;
    protected lastName: string;
    public age: number;

    constructor(firstName: string, lastName: string, age:number) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    getFirstName(): string {
        return this.firstName
    }

    setLastName(lastName): void{
        this.lastName = lastName;
    }
}

class Programmer extends Person{
    public readonly hair:boolean;
    constructor(firstName, lastName,age, hair:boolean){
        super(firstName,lastName, age );
        this.hair = hair;
    }
    getName(){
        return `${this.lastName}' ' and ' '${this.firstName}  `
    }
}

由上面这个例子,在定义新的方法"getName()"的时候,使用私有属性是不能被调用的,但是保护属性是可以被调用的,这就是两者的一点不同。

同时,如果我们给Person类的构造方法添加"protected"修饰,我们是不能对Person类直接传参数的,但是可以对"programmer"传参,与上面特性其实是相同的,private则都不能传参。

枚举

在ES6中对枚举只是简单带过,这里举个例子复习一下,顺便,其实枚举也有很多用途,许多下拉框的字符串可以以枚举的数字值来表示,这其实是一个很有用的特性。

enum DayOfWeek{
    Day, ofWeek, week
}
let plan: DayOfWeek = DayOfWeek.Day;
console.log(typeof plan, plan);
//0,number 0

最后是几个工具,包括直接编译运行TS文件ts-node,Webstorm好用的调试器JetBrains IDE Support等,大家自己去发掘想使用的工具吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章