我目前正在使用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中的变量?或者我担心我不应该做的事情?
答案 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 article和Eric 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