是否可以在JavaScript中从类外部访问用TypeScript编写的具有受保护/私有字段的类?
我目前正在学习TypeScript课程(我在OOP方面没有那么多经验) 下面的代码片段来自第章的“类” 事情是这样的: 我知道它不应该像在是否可以在JavaScript中从类外部访问用TypeScript编写的具有受保护/私有字段的类?,javascript,typescript,class,oop,Javascript,Typescript,Class,Oop,我目前正在学习TypeScript课程(我在OOP方面没有那么多经验) 下面的代码片段来自第章的“类” 事情是这样的: 我知道它不应该像在console.log(howard.name)中那样直接访问受保护的属性“name”,我知道通过派生类的方法访问它应该是可以的 当我在TypeScript上编译时,我确实收到一条错误消息。但事实是,当我在浏览器(编译)上打开生成的JS文件时,我可以在控制台中看到输出,就像它是公共属性一样 这在OOP中正常吗?如果在JS编译的文件中仍然可以访问,为什么还要在T
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
与我所知道的任何语言都无法访问任何内容无关。我认为您可能缺少的神奇词语是。最终,这就是这些东西存在的原因。我同意!把它封装成单词。我们发现: