Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在JavaScript中从类外部访问用TypeScript编写的具有受保护/私有字段的类?_Javascript_Typescript_Class_Oop - Fatal编程技术网

是否可以在JavaScript中从类外部访问用TypeScript编写的具有受保护/私有字段的类?

是否可以在JavaScript中从类外部访问用TypeScript编写的具有受保护/私有字段的类?,javascript,typescript,class,oop,Javascript,Typescript,Class,Oop,我目前正在学习TypeScript课程(我在OOP方面没有那么多经验) 下面的代码片段来自第章的“类” 事情是这样的: 我知道它不应该像在console.log(howard.name)中那样直接访问受保护的属性“name”,我知道通过派生类的方法访问它应该是可以的 当我在TypeScript上编译时,我确实收到一条错误消息。但事实是,当我在浏览器(编译)上打开生成的JS文件时,我可以在控制台中看到输出,就像它是公共属性一样 这在OOP中正常吗?如果在JS编译的文件中仍然可以访问,为什么还要在T

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

下面的代码片段来自第章的“类”

事情是这样的:

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

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

这在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
可见性修饰符(
protected
private
)不用于“安全”或“隐藏”任何内容。它不会保护数据不被访问。它的作用是为类/对象建立安全的接口。如果将某个内容分类为
public
,则意味着可以针对该属性编写其他代码。这意味着该属性最好不要在将来更改,否则可能会破坏其他代码<代码>受保护的和
私有的
属性在可从何处使用时受到了更大的限制,这为您提供了更好的保证,确保在更改它们时哪些内容会中断,哪些人会干扰这些值

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

可见性修饰符(
protected
private
)不用于“安全”或“隐藏”任何内容。它不会保护数据不被访问。它的作用是为类/对象建立安全的接口。如果将某个内容分类为
public
,则意味着可以针对该属性编写其他代码。这意味着该属性最好不要在将来更改,否则可能会破坏其他代码<代码>受保护的和
私有的
属性在可从何处使用时受到了更大的限制,这为您提供了更好的保证,确保在更改它们时哪些内容会中断,哪些人会干扰这些值


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

部门
是员工的私有,因此
getElevatorPitch()
方法可以访问它类型点脚本是为JS添加更多结构。编译后的JS总是与类型脚本的工作方式不同,因为它不同。如果您不想使用类,请使用js如果您想使用,请使用typescipt并将其编译为js。感谢您的评论!我知道。这是意料之中的。我没想到JS文件会显示
console.log(howard.name)在控制台中输出“Howard”。因为name属性应该受到保护。
department
是员工的私有属性,因此
getElevatorPitch()
方法可以访问该属性。类型点脚本用于向JS添加更多结构。编译后的JS总是与类型脚本的工作方式不同,因为它不同。如果您不想使用类,请使用js如果您想使用,请使用typescipt并将其编译为js。感谢您的评论!我知道。这是意料之中的。我没想到JS文件会显示
console.log(howard.name)在控制台中输出“Howard”。因为name属性应该受到保护。我开始写我自己的答案,但你抢先写了我的答案,只是想补充:在大多数语言中,
private
/
protected
结构只是语言深度。在C#和Java中,您都可以使用反射来绕过它们,而JS使这一点更容易做到,但不会太多。在几乎所有语言中,它最终都会在运行时存储在内存中,从那里可以清楚地读取
protected
/
private
与我所知道的任何语言都无法访问任何内容无关。我认为您可能缺少的神奇词语是。最终,这就是这些东西存在的原因。我同意!把它封装成单词。发现:开始写我自己的答案,但你比我快,只是想补充:在大多数语言中,
private
/
protected
结构只是语言深度。在C#和Java中,您都可以使用反射来绕过它们,而JS使这一点更容易做到,但不会太多。在几乎所有语言中,它最终都会在运行时存储在内存中,从那里可以清楚地读取
protected
/
private
与我所知道的任何语言都无法访问任何内容无关。我认为您可能缺少的神奇词语是。最终,这就是这些东西存在的原因。我同意!把它封装成单词。我们发现: