TypeScript - 私有变量和受保护变量之间的差异

时间:2016-04-25 14:24:09

标签: typescript

TypeScript中的privateprotected变量有什么区别? C#存在类似的问题,但我不确定两种语言中的概念是否相同。如果没有,了解差异会很有用。

3 个答案:

答案 0 :(得分:33)

与其他OO语言相同 私人方法/成员只能从班级内部访问 受保护的方法/成员也可以从类内部访问,也可以扩展类。

class A {
    private x: number;
    protected y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    getX(): number {
        return this.x;
    }

    getY(): number {
        return this.y;
    }
}

class B extends A {
    multiply(): number {
        return this.x * this.y;
    }
}

请注意,在课程A中,您可以访问(私人)this.x和(受保护)this.y
但是在课程B中,只有this.ythis.x的访问权才会出现此错误:

  

财产' x'是私人的,只能在A级进行访问

(您可以在playground

中看到错误

理解的重要之处在于,这只适用于打字稿 在javascript中,任何引用该实例的人都可以访问这些成员。

答案 1 :(得分:7)

protected在TypeScript中的工作方式与C#的工作方式非常相似。 TypeScript release notes文件如下:

  

类中新的protected修饰符的工作方式与熟悉的C ++,C#和Java语言类似。类的受保护成员仅在声明它的类的子类内可见

private只允许您访问直接类类型。私有成员对子类不可见。

答案 2 :(得分:6)

私人 方法

  

如果某个成员被标记为私有,则无法从中访问该成员   在其包含的类之外。

受保护 方法

  

受保护的修饰符与私有修饰符非常相似   声明受保护的成员也可以   在派生类中访问。

关于 one more Protected variables 点需要添加:

  

当基类变量受保护时,我们无法直接使用派生类中的变量。

例如:

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

class Mercedes extends Car{
    private noOfWheels: number;

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

    public getIntro() {
        return `Hello, This is my ${this.name} and I have ${this.noOfWheels} wheels.`;
    }
}

let myCar= new Mercedes ("COOL Car", 4);
console.log(myCar.getIntro());  //Hello, This is my COOL Car and I have 4 wheels.
console.log(myCar.name); // Error!! , Property 'name' is protected and only accessible within class 'Car' and its subclasses.
  

我们不能直接从Car类的外部使用变量 name ,我们仍然可以使用它   在梅赛德斯的实例方法中,因为梅赛德斯来自   车。