【问题标题】:Class with protected / private field written in TypeScript can be accessed from outside the class in JavaScript?可以从 JavaScript 中的类外部访问具有用 TypeScript 编写的受保护/私有字段的类吗?
【发布时间】:2019-01-01 06:26:46
【问题描述】:

我目前正在学习 TypeScript 课程(我在 OOP 方面没有太多经验)。

下面的sn-p来自https://www.typescriptlang.org/docs/handbook/classes.html中的classes章节

事情是这样的:

我知道它不应该直接访问受保护的属性“名称”,如console.log(howard.name),我知道通过派生类的方法访问它应该是可以的。

当我在 TypeScript 上编译它时,我确实收到了一条错误消息。但事实是,当我在浏览器上打开生成的 JS 文件(已编译)时,我可以在 Console 中看到输出,就像它是公共属性一样。

这在 OOP 中正常吗?如果在 JS 编译文件中无论如何都可以访问它们,为什么还要在 TypeScript 中创建具有受保护/私有属性的类?

class Person {
    protected name: string;
    constructor(name: string) { this.name = name; }
}

class Employee extends Person {
    private department: string;

    constructor(name: string, department: string) {
        super(name);
        this.department = department;
    }

    public getElevatorPitch() {
        return `Hello, my name is ${this.name} and I work in ${this.department}.`;
    }
}

let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // error

【问题讨论】:

  • department 是员工私有的,因此getElevatorPitch() 方法可以访问它
  • 类型脚本的重点是为JS添加更多结构。编译后的 JS 总是与 Typescript 不同,因为它不一样。如果你不想使用类,如果你想使用 js,使用 typecipt 并将其编译为 js。
  • 感谢您的评论!我知道。这是意料之中的。我没想到的是 JS 文件显示 console.log(howard.name); 在控制台中输出“霍华德”。因为 name 属性应该受到保护。

标签: javascript typescript class oop


【解决方案1】:

可见性修饰符(protected、private)不是为了“安全”或“隐藏”任何东西。它不会保护数据不被访问。它的作用是为您的类/对象建立安全接口。如果您将某物归类为public,则意味着可以针对该属性编写其他代码。这意味着该属性最好不要在将来更改,否则您可能会破坏其他代码。 protected 和 private 属性的使用位置受到更多限制,这可以更好地保证更改它们时会破坏什么以及谁会弄乱这些值。

Javascript 本身没有任何可见性修饰符的概念,在 Javascript 中都是public。这些仅在 Typescript 编译时强制执行,此时如果您违反自己的合同,您将收到通知。但该检查在运行时不存在。

【讨论】:

  • 开始写我自己的答案,但你打败了我,只是想补充一下:在大多数语言中,private/protected 结构只是语言深度。在 C# 和 Java 中,您都可以使用反射来绕过它们,授予 JS 可以更轻松地做到这一点,但不是很多。
  • 在几乎所有语言中,无论如何,它都会在运行时最终存储在内存中,从那里可以清楚地读取它。 protected/private 与我所知道的任何语言都无法访问任何内容无关。
  • 我认为您在这里可能缺少的神奇词是encapsulation。归根结底,这就是这些东西存在的原因。
  • 我同意!封装它这个词。找到这个:intertech.com/Blog/encapsulation-in-javascript
猜你喜欢
  • 2020-07-28
  • 2020-11-02
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2016-07-15
相关资源
最近更新 更多