• 修饰符 public、 private 和 protected和区别


     

    TypeScript 可以使用三种访问修饰符(Access Modifiers),分别是 public、private 和 protected。

    • public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
    • private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
    • protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的

    下面举一些例子:

    class Animal {
      public name;
      public constructor(name) {
        this.name = name;
      }
    }
     
    let a = new Animal('Jack');
    console.log(a.name); // Jack
    a.name = 'Tom';
    console.log(a.name); // Tom

    上面的例子中,name 被设置为了 public,所以直接访问实例的 name 属性是允许的。

    很多时候,我们希望有的属性是无法直接存取的,这时候就可以用 private 了:

    class Animal {
      private name;
      public constructor(name) {
        this.name = name;
      }
    }
     
    let a = new Animal('Jack');
    console.log(a.name); // Jack
    a.name = 'Tom';
     
    // index.ts(9,13): error TS2341: Property 'name' is private and only accessible within class 'Animal'.
    // index.ts(10,1): error TS2341: Property 'name' is private and only accessible within class 'Animal'.

    需要注意的是,TypeScript 编译之后的代码中,并没有限制 private 属性在外部的可访问性。

    上面的例子编译后的代码是:

    var Animal = (function () {
        function Animal(name) {
            this.name = name;
        }
        return Animal;
    }());
    var a = new Animal('Jack');
    console.log(a.name);
    a.name = 'Tom';

    使用 private 修饰的属性或方法,在子类中也是不允许访问的:

    class Animal {
      private name;
      public constructor(name) {
        this.name = name;
      }
    }
     
    class Cat extends Animal {
      constructor(name) {
        super(name);
        console.log(this.name);
      }
    }
     
    // index.ts(11,17): error TS2341: Property 'name' is private and only accessible within class 'Animal'.
     



    而如果是用 protected 修饰,则允许在子类中访问:

    class Animal {
      protected name;
      public constructor(name) {
        this.name = name;
      }
    }
     
    class Cat extends Animal {
      constructor(name) {
        super(name);
        console.log(this.name);
      }
    }
     
  • 相关阅读:
    Error no matching function for call to 'std::exception::exception(const char [15])'
    Difference between 'SAME' and 'VALID' padding
    使用 RamMap 清理内存 How to Use RamMap to Empty System Working Set
    Ubuntu中网络配置interfaces与界面网络配置NetworkManager
    ifup / ifdown eth0 / eno1 reports unknown interface when it exists!
    Tab Key not working when using Xfce remote desktop
    Batch Norm、Layer Norm、Weight Norm与SELU
    IIS 域名 带参数 设置重定向
    C# 切换到二级域名,使用Cookie
    web服务器 双网卡 路由 设置
  • 原文地址:https://www.cnblogs.com/flxy-1028/p/10959711.html
Copyright © 2020-2023  润新知