如何在Javascript中实现封装性?

3

我对JavaScript还比较新,正在阅读文档,

根据MDN文档:

保持对象的内部状态私有,并通常在其公共接口和私有内部状态之间进行明确区分,称为封装。

他们没有提到

如何保持对象的内部状态私有?

此外,它进一步提到:

在不强制执行访问的语言中,程序员使用命名约定来指示该属性应被视为私有,例如以下划线开头的名称。

那么这行代码是什么意思呢?

以下划线开头的名称,表示该属性应被视为私有。

这是否意味着如果我在属性名前面加上 _,它就会变成私有属性了,那么变为私有属性和使其成为私有属性之间有什么区别呢?将下划线放在前面是否能明确地告诉JavaScript该属性是私有的呢?

此外,他们没有提供任何具体的代码来解释这一点,我只能找到伪代码。

class Student : extends Person
    properties
       year
    constructor
        Student(name, year)
    methods
       introduceSelf()
       canStudyArchery() { return this.year > 1 }

我谷歌搜索了这个问题,发现闭包被用来实现封装行为,但是MDN文档没有任何地方说明这一点。面向对象编程#封装

问题: 如何在没有闭包的情况下实现JavaScript中的封装,我们可以使用像Object.freeze这样的东西吗?有人可以举个例子解释一下吗?

谢谢。


你所提供的文章是在讲解面向对象编程中的封装。他们解释了如何在JavaScript中实现封装,下一章节链接在这里:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Classes_in_JavaScript#encapsulation。 - yqlim
我投票关闭这个问题,因为 OP 无法从链接的文档中找到所需信息,因为信息位于链接文档的下一章节。 - yqlim
1个回答

3

这是否意味着如果我在属性名称前加上_,它就会变成私有的?

不是的。在字段名称前加上_是为了向读者传达这些字段应该是私有的;从技术上讲,它们并不是私有的。其他代码可以访问它们并对其进行更改。

真正私有的字段最近在Javascript语言中introduced

在上述功能引入之前,Javascript开发人员使用不同的技术来实现私有字段——其中之一是使用闭包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接