对于JS中的类的访问控制,我们可以使用Public、Private和Protected。
Public
Public成员是一些可以由任何方法和对象访问的属性和方法。在类中定义Public成员时,就像在全局函数和变量中那样,将函数或变量定义为类中的成员即可。
下面是一个简单的例子,其中定义了一个包含公共成员的车类:
class Car {
constructor(make, model, year) {
this.make = make; // 公共属性
this.model = model; // 公共属性
this.year = year; // 公共属性
}
getInfo() {
return `${this.make} ${this.model} (${this.year})`; // 公共函数
}
}
在上述示例中,构造函数constructor
和函数getInfo()
是公共成员。
公共成员是类的主要成员,并且它们不在一个单独的命名空间中隐藏。相反,它们在整个应用程序中可用于任何对象。公共成员对于保留类的状态是很重要的,通常它们用于提供存储单元或操作单元。
Private
私有成员只能在定义它们的类内部访问。私有成员必须使用私有字段或私有方法声明,并使用“#”作为前缀标识它们。
下面是一个简单的例子,其中定义了一个包含私有成员的车类:
class Car {
constructor(make, model, year) {
this.make = make; // 公共成员
this.model = model; // 公共成员
this.year = year; // 公共成员
this.#VIN = Math.floor(Math.random() * 10000000); // 私有属性
}
#VIN; // 私有字段
start() {
this.#engineOn();
}
#engineOn() {
console.log(`Engine of ${this.make} ${this.model} (${this.year}) is on!`); // 私有函数
}
}
let myCar = new Car('Toyota', 'Camry', 2021);
myCar.start(); // Engine of Toyota Camry (2021) is on!
console.log(myCar.#VIN); // SyntaxError: Private field '#VIN' must be declared in an enclosing class
在上述示例中,我们定义了一个私有属性#VIN
和一个私有方法#engineOn()
。私有成员在创建它们的类之外是不可见的。
Protected
Protected成员在类内和子类中可见。Protected成员与Private成员非常相似,因为它们只能在类的内部和子类中使用。Protected成员要使用关键字protected
来声明。
下面是一个简单的例子,其中定义了一个包含保护成员的车类:
class Car {
constructor(make, model, year) {
this.make = make; // 公共成员
this.model = model; // 公共成员
this.year = year; // 公共成员
this.#VIN = Math.floor(Math.random() * 10000000); // 保护属性
}
#VIN; // 保护字段
start() {
this.#engineOn();
}
#engineOn() {
console.log(`Engine of ${this.make} ${this.model} (${this.year}) is on!`); // 私有函数
}
}
class SportsCar extends Car {
constructor(make, model, year, topSpeed) {
super(make, model, year);
this.topSpeed = topSpeed; // 公共成员
}
getTopSpeed() {
return `The top speed of ${this.make} ${this.model} (${this.year}) is ${this.topSpeed} mph.`;
}
}
let mySportsCar = new SportsCar('Porsche', '911', 2021, 190);
mySportsCar.start(); // Engine of Porsche 911 (2021) is on!
console.log(mySportsCar.getTopSpeed()); // The top speed of Porsche 911 (2021) is 190 mph.
console.log(mySportsCar.#VIN); // SyntaxError: Private field '#VIN' must be declared in an enclosing class
在上述示例中,我们定义了一个保护属性#VIN
,并在派生类SportsCar
中添加了新的公共成员topSpeed
和一个新的公共函数getTopSpeed()
。
派生类SportsCar
可以访问基类Car
中的保护成员#VIN
,但不能直接从外部访问。同时,访问保护成员和私有成员的方式相似。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS 中的类Public,Private 和 Protected详解 - Python技术站