【问题标题】:How to make a class in ecma6 within an encapsulation?如何在封装内创建一个 ecma6 类?
【发布时间】:2017-06-02 03:21:33
【问题描述】:

在 ecma6 javascript 中,如何创建一个仅在以下范围内定义的类:

var name_space = new function() {

    class ball {
      ....
    }

    var handball = new ball();  // real object

};

var handball = new ball(); // error, ball not defined

这可能吗?

谢谢

【问题讨论】:

  • 不清楚你在问什么。你能提供一个示例用例吗?
  • 我试过了,最后一行出现错误。那么它不是已经在做你想做的了吗?
  • 这是伪代码,我正在尝试封装一个类定义。
  • 我取出.... 并在浏览器控制台中运行它,它完全符合您的要求。
  • 你认为name_space 有什么价值?

标签: javascript ecmascript-6


【解决方案1】:

当然:

(() => {
  class Ball {

  }

  let handball = new Ball(); // works
})();

let handball = new Ball(); // ReferenceError

不过,您可能不想这样做。 ES6 modulesIIFE 模式的一个不错的替代方案。

【讨论】:

  • 你是说在 es6 中,如果你导入的话,拥有全局命名空间是行不通的?
  • 基本上,是的。每个模块都有自己的范围,不会污染全局命名空间。您可以有选择地从您的模块中选择export 东西,然后使用import 只提取您需要的东西。这与使用立即调用的函数完成的事情相同,只是没有笨拙的语法。
  • 但是如果文件导入是这样的 `import foo from A',并且 foo 是一个警报 1 的函数,它和 var foo = function() {alert(1)}; 是一样的吗?而不是进行导入?所以 foo 不在 window 变量中。
  • 我可能误解了您的问题,如果这不是您要解决的问题,非常抱歉:当您使用导入和导出时,每个文件都是一个模块,每个模块都有自己的范围。因此,当您从A 导入foo 时,它仅在该文件中可用,不会附加到window 或泄漏到任何其他范围内。在底层,大多数模块捆绑器(如 Browserify 或 Webpack)将使用函数来包装所有内容,并使代码在当前不支持模块的 Web 浏览器中工作。这是一个很长的路要走,是的, foo 不在 window 变量中。希望有帮助!
【解决方案2】:

类已经只在最近的块范围内定义:

{ // a block scope
    class Ball {
        …
    }
    let handball = new Ball();  // real object
}

var handball = new Ball(); // ReferenceError, Ball not defined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 2011-04-25
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多