zoukankan      html  css  js  c++  java
  • 修饰符 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);
      }
    }
     
  • 相关阅读:
    SQL如何对时间戳字段按日期排序
    PHP书写SQL换行
    SQL修改字段
    SQL新增一个字段
    HTML加JS实现点击切换“观看”与“收起”效果切换
    盐:深沉的慢动作 让电影“支离破碎”
    笔:最终会走在一起吗
    笔:那个下午
    关于国内安装百夫长开源网站统计进度过慢的问题
    Java Web系列之JDBC
  • 原文地址:https://www.cnblogs.com/flxy-1028/p/10959711.html
Copyright © 2011-2022 走看看