【问题标题】:Scope private classes in a separate file范围私有类在一个单独的文件中
【发布时间】:2013-08-01 23:44:35
【问题描述】:

有没有办法在不污染全局命名空间的情况下在单独的文件中创建私有类?目前我只是创建一个子命名空间并将所有其他公共类需要运行的私有类放入,但是有没有办法让一个类完全私有,但在另一个文件中?

【问题讨论】:

  • 可以使用requirejscommonjs等加载器。
  • 啊,原来如此。谢谢!
  • 您可能想查看 JavaScript 中的“模块模式”。有很多口味,但我希望其中一种是您想要的。

标签: javascript oop


【解决方案1】:

您可能正在寻找 JavaScript 中的“模块模式”。模块模式名称可以引用许多不同的模式,但基本概念是声明仅对已调用的函数可用的函数和属性。像这样:

 myModule = function () {
    var me = {},
        iAmPrivate = 1;

     function privateFunc() {
        // stuff can access iAmPrivate and iamPublic
     }

     me.iamPublic = 1;
     me.publicFunc = function () {
        // stuff can access iAmPrivate and iamPublic
     };

     return me;

 }());

 myModule.publicFunc();  // this can be called
 myModule.iamPublic;     // this can be accessed

 myModule.iAmPrivate     // xx can't do this
 myModule.privateFunc()  // or this

由于闭包和作用域的工作原理,在该函数调用中声明的本地项可用于该函数调用中声明的所有函数,但在该函数调用之外不可用。该函数已被调用,因此它们永远无法被访问。

你可以在这里阅读更多关于它的信息:http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html,当然还有谷歌搜索,因为你知道它叫什么。

【讨论】:

  • 我想我最初的问题是:如果您想在与调用模块分开的文件中定义私有方法/类会发生什么?这可能吗?
  • @sircodesalot - 不知道你到底在问什么。将上面的代码放在一个名为 hogan_wrote_this.js 的文件中,然后在另一个文件中,如果你想使用它,只需加载它。这就是每个 JavaScript 框架或库的工作方式。
  • 我的意思是私有成员是作为闭包的一部分实现的。如果我想说,创建另一个类(并将其设为私有——只有包含闭包的其他成员可以访问),那么我会将该类与其消费者一起放入闭包中。更好的是,定义该类,但在一个单独的文件中......同时仍确保所述类保持私有。如果你在一个模块中捕获它,那么它就不再是私有的了,因为该模块在技术上是全局可访问的。
  • @sircodesalot - 不,它是私有的。即使模块(上例中的 myModule)对其他代码可用,闭包中定义的所有代码也不能被其他代码访问。模块模式有效并且很好,但是 JavaScript 中的模块将来如何工作在 JavaScript 6(有时称为 Harmony)规范中正式化。例如,JavaScript 6 模块在 node.js 和大多数现代浏览器中实现。它们的工作方式与上面描述的模块模式完全相同,只是有一些语法糖。
  • 好的,但问题是,如果你需要一个闭包来将一​​个项目设为私有,一个闭包可以跨越多个文件吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多