我如何隐藏' Javascript中的变量同时暴露公共静态方法?

时间:2015-01-31 15:25:07

标签: 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中的变量?或者我担心我不应该做的事情?

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

我看到你想给出一些结构并组织你的javascript代码。这最好用Javascript处理,通常称为Module Pattern

简而言之,它的工作原理如下:

var MODULE = (function () {
    var my = {},
        privateVariable = 1;


    function privateMethod() {
        // ...
    }

    my.moduleProperty = 1;
    my.moduleMethod = function () {
        // ...
    };

    return my;
}());

Ben Cherry's articleEric Miraglia's文章中记录了此摘录和进一步阅读。模块模式有一些整齐的变化,一个是Christian Heilmann

的揭示模块模式

答案 2 :(得分:1)

只需将其变为局部变量并使用getter函数来获取它们。此外,尝试维护命名方案。对于构造函数,名称应以大写字母开头。

function Mars(){
   var x = [{A:1, B:2, C:3},{A:1, B:2, C:3}];
   this.getArr = function(){
       return x;
   }
}
var mars = new Mars();
mars.x; // undefined
mars.getArr(); // [Object, Object]

答案 3 :(得分:1)

你担心这个是正确的。如果您不解决此问题,您的代码将变得无法管理。

您可以使用函数来控制JavaScript中的范围。 JS没有课程。 ES6(没有广泛使用)有"类",但只是真正的名字。

您可以尝试这样的事情:

var myApp = {};

(function(namespace){

  var X = [{A:1, B:2, C:3},{A:1, B:2, C:3}]; // Capitalized because 'constant'.
  var Y = [{A:1, B:4, C:2},{A:1, B:2, C:3}]; // Capitalized because 'constant'.

  function Mars () {} // Capitalized because this is a constructor function.

  Mars.prototype.doSomething = function(foo) {
    //do something with X
    return X[foo]; // For example.
  }

  namespace.mars = new Mars(); // Lowercase on 'namespace.mars' because it is an instance.

}(myApp))


// Use...
myApp.mars.doSomething(foo); // Does something.
Mars; // undefined
X; // undefined
Y; //undefined

答案 4 :(得分:1)

我认为下面的示例可以让您深入了解私有,公共和静态变量和方法。

function Mars(){
  // private variables
  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}]; 

  // public variables
  this.z = 2;

  // privileged methods, can access private variables
  this.getX = function(){
      return x;
  };

  this.getY = function(){
      return y;
  };  
}

// public prototype method, can not access private variables
// access private variables through getters
Mars.prototype.getZ = function(){
  return this.z;
}

// static variable
Mars.staticVar = 1;

// static method
Mars.staticMethod = function(){
   console.log('It is the static method');
}



var marsObj = new Mars();
console.log(marsObj.getX()); //Array [ Object, Object ]
console.log(marsObj.getZ()); //2

Mars.staticMethod(); // "It is the static method"
marsObj.staticMethod(); // Exception: mars.staticMethod is not a function

要了解JavaScript中的OOPS,我建议您使用本教程: http://phrogz.net/JS/classes/OOPinJS.html