在 JavaScript 中,我们经常需要在对象中定义私有属性。而如果使用传统的方法,我们通常需要使用下划线前缀命名属性来表示它们是私有的。但在 ECMAScript 2019 (ES10) 中,我们可以使用 closure 来模拟私有属性实现。
什么是 closure
在 JavaScript 中,closure 是指一个函数,它可以引用在它外部定义的变量。这意味着函数可以访问自己外部作用域中的变量,即使在函数调用后这些变量的作用域已经结束。
如何使用 closure 创建私有属性
在 JavaScript 中,可以使用闭包来模拟私有属性实现。具体来说,可以在一个函数内部定义一个变量,并将其返回给外部函数,这样就可以在外部函数中访问该变量,并使用它来模拟私有属性。
以下是一个例子,展示如何使用 closure 创建一个私有属性 name
:
-- -------------------- ---- ------- -------- ------------ - --- ----- - ----- ------------ - ---------- - ------ ------ -- ------------ - -------------- - ----- - ----- -- - ----- ------ - --- --------------- ------------------------------ -- -- ------ ------------------------ ------------------------------ -- -- -------
在上面的例子中,Person
构造函数内部定义了一个私有变量 _name
,它不会被其他代码访问。但是,该对象包含了两个可以被其他代码调用的公共方法 getName
和 setName
。这两个方法分别用于获取和设置 _name
变量的值。由于这两个方法都是在 Person
内部定义的,它们可以访问并修改 _name
变量。
prototype 和 closure
在上面的例子中,每次创建一个新的 Person
对象时,都会在内存中创建一组新的 getName
和 setName
方法。这可能会导致内存浪费。
为了减少内存使用,可以将公共方法定义到原型上,将私有变量和属性定义在闭包中。
以下是一个例子:
-- -------------------- ---- ------- -------- ------------ - ------------------- - ------------------------ - ---------- - ------ ----------- -- ------------------------ - -------------- - --- ----- - ----- ------------ - ---------- - ------ ------ -- ------------ - -------------- - ----- - ----- -- -- ----- ------- - --- --------------- ------------------------------- -- -- ------ ------------------------- ------------------------------- -- -- ------- ----- ------- - --- --------------- ------------------------------- -- -- ------ ------------------------ ------------------------------- -- -- ------
在这个例子中,我们将 getName
和 setName
方法添加到了原型上,以避免每次创建实例时都会生成新的函数。而 _name
私有变量是在 setName
方法内使用 closure 实现的。这样,我们就能够在实例方法和私有变量之间保持分离和隔离。
总结
ECMAScript 2019 (ES10) 提供了利用 closure 实现私有属性的一种方式。通过将变量定义在闭包内部,我们可以保护这些变量并确保其他代码无法访问。在 JavaScript 中,我们可以使用这个特性来实现真正的私有属性,并在代码中保持良好的封装性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c3d4b783d39b48817c37f1