Typescript中private、public、protected修饰符的区别

首先我们需要了解什么是类,class。

什么是面向对象编程?

即Object Oriented Programming,OOP。主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。面向对象程序设计中的概念主要包括:对象、、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。

面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。

类Class

以下是一个常见的类的写法。

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter = new Greeter("world");

我们声明一个Greeter类。这个类有3个成员:一个叫做greeting的属性,一个构造函数和一个greet方法。

公共public,私有private与受保护protected的修饰符

一般来说,在TypeScript里,成员都默认为public

我们可以把上面的例子写成这样:

class Greeter {
    public greeting: string;
    public constructor(message: string) {
        this.greeting = message;
    }
    public greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter = new Greeter("world");

当成员被标记成private时,它就不能在声明它的类的外部访问。

class Greeter {
    private greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
}
new Greeter('abc').greeting; // 错误:'greeting'是私有的。

protected修饰符与private修饰符的行为很相似,但有一点不同,protected成员在派生类中仍然可以访问。 例如:

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

class Employee extends Person {
    private department: string;

    constructor(name: string, department: string) {
        super(name)
        this.department = department;
    }

    public getElevatorPitch() {
        return `Hello, my name is ${this.name} and I work in ${this.department}.`;
    }
}

let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // 错误