TypeScript中的private
和protected
变量之间有什么区别?对于C 35;
也存在类似的问题,但我不确定这两种语言中的概念是否相同。如果没有,了解这些差异将是有益的。
这与其他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;
}
}
请注意,在classA
中,可以同时访问(private)这两个属性。x
和(受保护的)这个。y
但是在B类中,只有可以访问这个。y
和这个。x出现以下错误:
属性'x'是私有的,只能在类A中访问
(你可以在操场上看到错误)
但重要的是要理解,这只适用于typescript
在javascript中,任何引用该实例的人都可以访问这些成员。
私人方法:
当成员被标记为私有时,不能从其包含类之外访问它。
保护方法:
受保护修饰符的作用与私有修饰符非常相似,只是声明为受保护的成员也可以在派生类中访问。
关于受保护的变量
,还有一个点要添加:
当基类变量受到保护时,我们不能直接从派生类使用它的变量。
例如:
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类外部使用变量名,我们仍然可以从Mercedes的实例方法内部使用它,因为Mercedes源于Car。
protected
在TypeScript中的工作方式与在C#中的工作方式非常相似。TypeScript发行版将其记录为:
类中新的受保护修饰符的工作方式与熟悉的语言(如C、C#和Java)中的一样。类的受保护成员仅在声明它的类的子类中可见
而private
只允许您访问即时类类型。私有成员对子类不可见。