Javascript TypeScript中封装的工作原理

Javascript TypeScript中封装的工作原理,javascript,typescript,oop,Javascript,Typescript,Oop,我试图理解Typescript中的封装是如何工作的,并给出了一个例子,这个例子让我感到困惑,为什么我能够访问甚至直接更改某个类的私有成员 class Encapsulate { str:string = "hello" private str2:string = "world" } var obj = new Encapsulate(); console.log(obj.str); //accessible obj.str2 = "something else"; co

我试图理解Typescript中的封装是如何工作的,并给出了一个例子,这个例子让我感到困惑,为什么我能够访问甚至直接更改某个类的私有成员

class Encapsulate {
    str:string = "hello"
    private str2:string = "world"
}

var obj = new Encapsulate();
console.log(obj.str);     //accessible
obj.str2 = "something else";
console.log(obj.str2);   //compilation Error as str2 is private
输出:您好,还有别的吗


由于str2是私有的,我得到了一个编译时警告,比如编译错误,但我仍然能够更改它或访问它。我是否遗漏了封装的一般概念,它是什么,以及它是如何在Typescript上工作的

这是预期的,因为TypeScript只是一种静态类型检查语言。
编译为js后,您执行的操作是有效的,因此不会出现运行时错误,因为TypeScript只是一种静态类型检查语言。
编译为js后,您执行的操作是有效的,因此没有运行时错误,Javascript没有类()的私有和公共成员的概念。此时,仅在编译时检查将类中的属性或函数标记为private(这就是为什么会出现语法错误)


您的代码仍将运行,因为即使Typescript生成了语法错误,它也很可能输出了有效的Javascript代码。

Javascript没有类()的私有和公共成员的概念。此时,仅在编译时检查将类中的属性或函数标记为private(这就是为什么会出现语法错误)


您的代码仍将运行,因为即使Typescript生成语法错误,它也很可能仍然输出有效的Javascript代码。

问题是Typescript只编译成Javascript,但它没有运行时

TypeScript将在编译类型处向您提供这些警告。它告诉你:

Y,
enclosure
str2
是私有的,您仍在尝试访问它。你不应该那样做

但是,一旦ts编译并生成js代码,所有的typescript注释都会在代码中丢失。JavaScript对
私有
枚举
接口
一无所知。一旦您的代码被编译并在浏览器或任何其他js运行时中运行,您将有一个
封装
javaScript对象,其中包含两个字段,
str1
str2
。它们不能是
private
public
,因为js不知道这一点<代码>封装
将是一个纯裸javaScript对象

所以,基本上,typeScript可以帮助您在编译时捕获错误。但是,一旦代码编译完成,它将“忘记”关于typeScript注释的一切


它可以告诉您不应该访问str2。如果发现这样的错误,它甚至可以拒绝编译(这取决于tsconfig配置)。但是编译后的代码与typescript没有任何关系。

问题是typescript只编译成javaScript,但它没有运行时

TypeScript将在编译类型处向您提供这些警告。它告诉你:

Y,
enclosure
str2
是私有的,您仍在尝试访问它。你不应该那样做

但是,一旦ts编译并生成js代码,所有的typescript注释都会在代码中丢失。JavaScript对
私有
枚举
接口
一无所知。一旦您的代码被编译并在浏览器或任何其他js运行时中运行,您将有一个
封装
javaScript对象,其中包含两个字段,
str1
str2
。它们不能是
private
public
,因为js不知道这一点<代码>封装
将是一个纯裸javaScript对象

所以,基本上,typeScript可以帮助您在编译时捕获错误。但是,一旦代码编译完成,它将“忘记”关于typeScript注释的一切


它可以告诉您不应该访问str2。如果发现这样的错误,它甚至可以拒绝编译(这取决于tsconfig配置)。但是编译后的代码与typescript没有任何关系。

这可能是无效的typescript,但它是有效的Javascript,因为所有Javascript都可以在typescript中运行,但编译器会抱怨。可能是在typescript中的重复。这可能是无效的typescript,但它是有效的Javascript,因为所有Javascript都可以在Typescript中运行,所以它可以工作,但编译器会抱怨。Typescript中的可能重复。