乐趣区

TypeScript-Class

TypeScript 是一个结构类型系统。意思就是当我们比较两个类型的时候,只关注他们的架构是否一样,而不是在乎他们的原型是否一样。

但是,当我们谈到 Class 的时候,上面的结论并不总是正确。这个取决于我们的 Class 的属性是 public,private,还是 protected。

一:当 Class 的所有属性都是 public

首先,当你不特别指定的时候,Class 的属性默认是 public 的。

如果是 2 个基于某个 class 而 new 出来的对象,我们说这两个对象的类型是否兼容,只要看这个对象的结构是否一致,而不一定要对应的 class 是否是相同的。– 但是,这点只针对于 class 的所有属性都是 public 的时候。看下面的例子:

class Animal { 
    name: string;
    constructor(name: string) {this.name = name;}
}
class Person { 
    name: string;
    constructor(name: string) {this.name = name;}
}

let animal: Animal = new Animal('kitty');
let person: Person = new Person('nana');
animal = person; // 这样是不会报错的,以为 animal 和 person 有相同的结构
animal = 1; // 报错,数字 number 型和 animal 结构不一样。

二:当 Class 拥有 private 或者 protect 属性时候
当 Class 拥有 private 或者 protected 的属性的时候,光是结构一样,并不能带来类型一样的结果:

class Animal { 
    private name: string;
    constructor(name: string) {this.name = name;}
}
class Person { 
    name: string;
    constructor(name: string) {this.name = name;}
}

let animal: Animal = new Animal('kitty');
let person: Person = new Person('nana');
animal = person; //Error, 类型不一样

这段代码,我们仅仅是使得 Animal 的 name 变为 private,并没有改变它的结构,但是 animal 和 person 已经是不同类型。当我们把 person 赋值给 animal 的时候,就会得到一个 error。

这里我们是把 Animal 的属性改为了 private,对于 protected 也是一样的结果。
三:Public, Protect, Private 的区别

1: public 的属性,可以在 instance 上访问
2: protect 的属性,不可以在 instance 上访问,但是可以在子类里  面访问
3: private 的属性,只能在本 class 内部访问

例如:

class Animal { 
    public category: string;
    protected color: string;
    private name: string;

    constructor(category: string, name: string, color: string) { 
        this.category = category;
        this.name = name;
        this.color = color;
    }
}
class Cat extends Animal {constructor(category: string, name: string, color: string) {super(category, name, color);
    }
    printInfo() {console.log(`The category of the cat is ${this.category}`); // No Error
        console.log(`The color of the cat is ${this.color}`);// No Error
        console.log(`The name of the cat is ${this.name}`);//Error!}

}
let animal = new Animal('animal', 'animal', 'white');
let cat = new Cat('cat', 'kitty', 'black');
animal.category = 'animal_1';//No Error. 可以在 instance 上访问 public 的属性
console.log(cat.color);//Error!不能在 insatance 上访问 protect 的属性

总结的话,我们的属性访问权限有 3 个 level:

1:可以在 instance 上访问的:public
2:可以在子类里面访问的:public 和 protected
3:只可以在 class 内部访问的:private
退出移动版