在只有nodejs的环境中,在ES6 Module / Class中定义“真正的”私有方法,而不会泄漏任何信息

我知道,没有真正的私人方法INSIDE ES6类。 不过,我正在玩一下,发现了一些好东西 – 也许…

正如我所说,不可能不公开对象的属性。 但是我试图实现一些OOP编程,因为我把我的类分成单独的文件,然后导出这些类,如:

class MyClass { constructor() { /** * Initialize stuff... */ } myMethod() { /** * Do public stuff... */ } } // expose class to environment. export default MyClass; 

所以我可以导入类:

import MyClass from './MyClass.js';

当然myMethod可以从导入模块的其他文件访问。 Sinced我需要的variables和函数只能由我尝试过的类访问:

 // private variable outside of class scope but still accessible. let possiblePrivateVariable = 'am I a private variable?'; class MyClass { constructor() { /** * Initialize stuff... */ } myMethod() { // run private method. console.log(_possiblePrivateMethod()); // show private variable. console.log(possiblePrivateVariable); } } // private function outside of class scope but still accessible. function _possiblePrivateMethod() { return 'am I a private method?'; } // expose class to environment. export default MyClass; 

现在你不能访问私有variables和私有方法:

 // Import class to newFile.js and use it. import MyClass from './MyClass.js'; const exposedClass = new MyClass(); exposedClass.possiblePrivateVariable; // -> undefined. exposedClass._possiblePrivateMethod(); // -> undefined. exposedClass. myMethod(); // -> logs: am I a private method? // am I a private variable? 

很明显,这些感觉就像是“私人”的,因为我没有用export这个词来暴露他们。 我的问题是,如果这个方法可以考虑创build私有variables和方法? 如果我所显示的方法在运行代码时有任何其他可能的泄漏?

问候,Megajin


旁注:我不需要浏览器支持,因为它是一个NodeJS唯一的环境。 我正在使用NodeJS v8.1.4并在我的npm start脚本中使用babel ,所以我可以使用没有任何TypeErrorimport

我还要提到,我知道这个问题可以被看作是重复的,但这不是因为这个问题不是关于一个类中的私有属性,variables和方法,而是关于这个问题。

我的问题是,如果这个方法可以考虑创build私有variables和方法?

是的,这是一个实际的工作解决scheme,以解决ES6 / 7/8不能处理类隐私的事实。

如果我所显示的方法在运行代码时有任何其他可能的泄漏?

快速回答: 没有泄漏

详细答案:

在你的私有函数系统中,使函数保密的是在javascript中函数的作用域是由它定义的地方来定义的。 在你的情况下,该文件。

如果不将该function导出到文件外部,则无法访问该文件。 就像你不能访问以下主stream例子中的函数一样:

 function toto() { const tmpToto = () => console.log('Hello'); // I can access tmpToto from here tmpToto(); return false; } // I cannot access tmpToto from here 

在这里你可以得到关于范围的很好的解释


根据评论更多的信息

你将如何解决多个类实例共享“超出范围”variables的问题?

你可以在这篇文章中使用@Son JoungHo所描述的IIFE(立即调用的函数expression式) 。

 let Name = (function() { const _privateHello = function() {} class Name { constructor() {} publicMethod() { _privateHello(); } } return Name; })();