TypeScript 私有、公共和受保护访问修饰符

TypeScript 私有、公共和受保护访问修饰符

访问修饰符是必不可少的,因为它们允许我们强制封装并定义类成员的边界。通过访问修饰符,我们可以限制对某些成员的访问,确保它们仅在类内部可访问。我们还可以将成员设为公共,允许从我们代码库中的任何地方访问它们。此外,受保护成员可以在类及其派生类中访问。

在本教程中,我们将探讨TypeScript中的私有、公共和受保护访问修饰符。

语法

用户可以按照下面的语法将访问修饰符应用到TypeScript类的成员上:

class ClassName {
   private propertyName: type;
   public methodName(): returnType {
      // Method body
   }
   protected anotherPropertyName: type;
}

在上面的语法中 −

  • private − 这个访问修饰符限制了成员的访问范围,只能在声明它的类中访问。关键字 private 用于表示它。

  • public − 这个访问修饰符允许从任何地方无限制地访问成员。如果没有指定访问修饰符,则它是默认的访问修饰符。关键字 public 用于表示它。

  • protected − 这个访问修饰符允许在类及其派生类中访问成员。它由关键字 protected 表示。

示例1:公共访问修饰符

在这个例子中,我们创建了一个名为 Person 的类,它有一个公共的属性 name,可以在代码中的任何地方访问和修改。我们还有一个公共的方法 greet(),它使用 name 属性打印一个问候信息。

然后我们创建了一个名为 Person 的 Person 类的实例。我们可以直接访问 person 对象的 name 属性并为它赋值。最后,我们在 person 对象上调用 greet() 方法,输出包含提供的名字的问候消息。用户可以观察输出结果来查看包含提供的名字的问候消息。

class Person {
   public name: string = "";

   public greet(): void {
      console.log(`Hello, my name is ${this.name}!`);
   }
} 
// Creating an instance of the Person class
const person = new Person(); 

// Assigning a value to the public property
person.name = "John"; 

// Calling the public method to display the greeting
person.greet();

在编译时,它会生成以下的JavaScript代码−

var Person = /** @class */ (function () {
   function Person() {
      this.name = "";
   }
   Person.prototype.greet = function () {
      console.log("Hello, my name is ".concat(this.name, "!"));
   };
   return Person;
}());
// Creating an instance of the Person class
var person = new Person();

// Assigning a value to the public property
person.name = "John";

// Calling the public method to display the greeting
person.greet();

输出

上述代码将产生以下输出-

Hello, my name is John!

示例2:私有访问修饰符

在这个示例中,我们创建了一个BankAccount类,其中包含一个私有属性balance,只能在类内访问和修改。此外,我们还有一个私有方法calculateInterest(),根据余额计算利息。

在定义了类之后,我们创建了一个名为account的BankAccount类实例,初始余额为$1000。

然而,试图从类外直接访问私有属性balance或调用私有方法calculateInterest()将导致错误,因为这些成员在类范围之外是不可访问的。

用户可以观察到尝试访问私有成员将导致TypeError的输出。

class BankAccount {
   private balance: number; 
   constructor(initialBalance: number) {
      this.balance = initialBalance;
   } 
   private calculateInterest(): number {
      const interestRate = 0.05;
      return this.balance * interestRate;
   } 
}  
// Creating an instance of the BankAccount class
const account = new BankAccount(1000); 

// Attempting to access private members
console.log(account.balance); 
console.log(account.calculateInterest());

编译后,将生成以下JavaScript代码−

var BankAccount = /** @class */ (function () {
   function BankAccount(initialBalance) {
      this.balance = initialBalance;
   }
   BankAccount.prototype.calculateInterest = function () {
      var interestRate = 0.05;
      return this.balance * interestRate;
   };
   return BankAccount;
}());
// Creating an instance of the BankAccount class
var account = new BankAccount(1000);

// Attempting to access private members
console.log(account.balance);
console.log(account.calculateInterest());

并且它会产生以下错误−

Property 'balance' is private and only accessible within class 'BankAccount'.
Property 'calculateInterest' is private and only accessible within class 'BankAccount'.

输出

以上的 JavaScript 代码将会产生以下的输出 −

1000
50

示例3:受保护的访问修饰符

在这个例子中,我们创建了一个基类Animal,具有一个受保护的属性name,可以在类及其派生类中访问和修改。我们还有一个受保护的方法makeSound(),仅仅记录一条消息。

然后,我们创建了一个派生类Dog,它扩展了Animal类。Dog类添加了一个公共方法bark(),利用从基类继承的name属性输出一条狗吠的消息。

最后,我们创建了一个名为”Buddy”的Dog类实例dog,并调用bark()方法。

输出将显示狗的名字,后跟狗吠的消息。

class Animal {
   protected name: string; 
   constructor(name: string) {
      this.name = name;
   } 
   protected makeSound(): void {
      console.log("The animal makes a sound");
   }
} 
class Dog extends Animal {
   public bark(): void {
      console.log(`${this.name} barks!`);
   }
} 
// Creating an instance of the Dog class
const dog = new Dog("Buddy"); 
dog.bark();

在编译时,它将生成以下的JavaScript代码 –

var __extends = (this && this.__extends) || (function () {
   var extendStatics = function (d, b) {
      extendStatics = Object.setPrototypeOf ||
         ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
         function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
      return extendStatics(d, b);
    };
    return function (d, b) {
      if (typeof b !== "function" && b !== null)
         throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
      extendStatics(d, b);
      function __() { this.constructor = d; }
      d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
   };
})();
var Animal = /** @class */ (function () {
   function Animal(name) {
      this.name = name;
   }
   Animal.prototype.makeSound = function () {
      console.log("The animal makes a sound");
   };
   return Animal;
}());
var Dog = /** @class */ (function (_super) {
   __extends(Dog, _super);
   function Dog() {
      return _super !== null && _super.apply(this, arguments) || this;
   }
   Dog.prototype.bark = function () {
      console.log("".concat(this.name, " barks!"));
   };
   return Dog;
}(Animal));
// Creating an instance of the Dog class
var dog = new Dog("Buddy");
dog.bark();

输出

在编译时,上述代码将生成一段JavaScript代码。这段JavaScript代码将产生以下结果:

Buddy barks!

在本教程中,我们学习了TypeScript中的私有、公有和受保护的访问修饰符。私有成员只能在类内部访问,公有成员可从任何地方访问,受保护成员可在类及其派生类中访问。通过使用这些访问修饰符,我们可以根据需要控制类成员的可见性和可访问性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

TypeScript 精选笔记