在只有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
,所以我可以使用没有任何TypeError
的import
。
我还要提到,我知道这个问题可以被看作是重复的,但这不是因为这个问题不是关于一个类中的私有属性,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; })();