javascript - 如何在暴露公共(public)静态方法时在 Javascript 中使用 'hide' 变量?

标签 javascript static-methods

我目前正在使用 Javascript 重写一些科学 C++ 代码,如果可能的话,我希望保持相同的基本组织。在 C++ 代码中,有许多类包含许多不同数组中的一堆 const 数据,以及一系列处理这些数据的 public static 方法数据。我正在为如何在 Javascript 中复制这样的东西而苦苦挣扎。

目前我正在使用如下内容:

function mars(){}

mars.x = [{A:1, B:2, C:3},{A:1, B:2, C:3}]; //...
mars.y = [{A:1, B:4, C:2},{A:1, B:2, C:3}]; //...
// ...about 600 lines in total

mars.doSomething = function(foo){
    var result = 0;
    // Do lots of processing of above arrays
    return result;
}

mars.doSomethingElse = function(bar){
    var result = 0;
    // Do lots of processing of above arrays
    return result;
}

console.log(mars.doSomething(3))

这可行,但它会将 mars.x 等暴露给实际上不需要了解它的其余代码。如果我使用 prototype,方法将不再是静态的,并且代码中将充斥着 new 调用,这是我真正不想要的。

那么我要问的是:如何在将静态方法暴露给其余代码的同时在 JavaScript 中隐藏变量?还是我在担心不该担心的事情?

最佳答案

要隐藏变量,可以使用闭包(函数作用域)

function mars () {
  var staticFunctions = Object.create(null); // the same as {}
  var x = [{A:1, B:2, C:3},{A:1, B:2, C:3}];
  var y = [{A:1, B:4, C:2},{A:1, B:2, C:3}];

  staticFunctions.doSomething = function (foo) {
    return x;
  };

  staticFunctions.doSomethingElse = function (bar) {
    return y;
  };

  return staticFunctions;
}

// you do need to instantiate mars however
var m = mars();
// if you don't want that you can do
var mars = (function () {
    // same as above
} ()); // this invokes the function for you

关于javascript - 如何在暴露公共(public)静态方法时在 Javascript 中使用 'hide' 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28253248/

相关文章:

java - 当尝试在静态方法调用中模拟静态方法调用时,Powermock 会调用初始方法

go - Go 中静态方法的等价性

javascript - 具有两种不同布局的 Angular Js 应用程序

javascript - 编译 typescript 时排除文件夹

javascript - 如何使用Lodash让这个映射变得更简单?

javascript - Asp.Net Mvc 使用 Knockout 渲染局部 View

objective-c - Objective-C 中的静态方法(不是类方法)

Python:使类可迭代

c++ - 从另一个 header 中的 header 调用静态方法

javascript - 播放YouTube视频时使用Javascript静音嵌入式mp4吗?