美文网首页
TypeScript class 的访问控制

TypeScript class 的访问控制

作者: _扫地僧_ | 来源:发表于2021-08-11 09:10 被阅读0次

默认的控制权限是 public.public 属性的字段和方法,可以在 class 外部被访问。

class Greeter {
  public greet() {
    console.log("hi!");
  }
}
const g = new Greeter();
g.greet();

因为 public 已经是默认的可见性修饰符,所以你不需要将它写在类成员上,但可能出于样式/可读性原因选择这样做。

protected

受保护的成员仅对声明它们的类的子类可见。

Exposure of protected members

派生类需要遵循其基类契约,但可以选择公开具有更多功能的基类子类型。 这包括公开受保护的成员:

class Base {
  protected m = 10;
}
class Derived extends Base {
  // No modifier, so default is 'public'
  m = 15;
}
const d = new Derived();
console.log(d.m); // OK

请注意,Derived 已经能够自由地读取和写入 m,因此这不会有意义地改变这种情况的“安全性”。 这里要注意的主要事情是,在派生类中,如果这种暴露不是故意的,我们需要小心地重复受保护的修饰符。

private

private 类似于 protected,但不允许从子类访问成员:

上述例子表明我们不能在子类里将父类的 private 属性提升成 protected 或者 public.

子类也无法访问父类的 private 字段。

Cross-instance private access

在 TypeScript 类实例内部,一个实例能访问其他实例的私有字段吗?答案是可以。

class A {
  private x = 10;

  public sameAs(other: A) {
    // No error
    return other.x === this.x;
  }
}

TypeScript class 访问控制的镜花水月

与 TypeScript 类型系统的其他方面一样,private 和 protected 仅在类型检查期间强制执行。 这意味着 JavaScript 运行时构造(如 in 或简单属性查找)仍然可以访问私有或受保护成员。

class MySafe {
  private secretKey = 12345;
}
Try
// In a JavaScript file...
const s = new MySafe();
// Will print 12345
console.log(s.secretKey);

上面这段 TypeScript 代码虽然有语法错误,但是编译成 JavaScript 之后,仍然能够成功执行,访问到 s 的 secretKey 字段。

更多Jerry的原创文章,尽在:"汪子熙":


相关文章

网友评论

      本文标题:TypeScript class 的访问控制

      本文链接:https://www.haomeiwen.com/subject/urnoyltx.html