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/

相关文章:

javascript - 根据选择哪个单选按钮,显示和/或隐藏输入框和标签

javascript - 3D 开发 - Javascript/HTML5/CSS3?

Java 泛型 + 静态工厂方法 = [ panic ]

python - staticmethod 和 classmethod 装饰器可以用纯 Python 实现吗?

java - Rhino:如何从 ScriptableObject 中获取所有属性?

javascript - Bluebird 在与 Sequelize/MySQL 一起使用时显示损坏的堆栈跟踪

python - 如何使用类方法创建自定义类实例?

javascript - Javascript-无法静态引用非静态函数

asp.net - 静态方法是否适用于 Linq To SQL DAL?

javascript - gatsby 是否默认删除 proptype?