javascript“静态导入”

时间:2013-01-14 22:50:11

标签: javascript namespaces

javascript中有什么东西相当于java静态导入吗?例如,如果我有Math类看起来像

com.example.Math = function() {

   function1(...) {}
   function2(...) {}

}

现在,这些函数中的一些自然地链接在一起,使得输出到一个是另一个的输入。我可以做点像

com.example.Math.function2(com.example.Math.function1());

这看起来有点丑陋,我真的想做点什么:

function2(function1())

但我不想将function1和function2放在全局命名空间中。这可能吗?

4 个答案:

答案 0 :(得分:2)

是的,有。它被称为with

with (com.example.Math) {
    function2(function1());
}

那说:

  

建议不要使用with,并且在ECMAScript 5 strict mode中禁止使用var m = com.example.Math; m.function2(m.function1()); 。建议的替代方法是将要访问其属性的对象分配给临时变量。

例如:

{{1}}

答案 1 :(得分:1)

怎么样:

var Math = com.example.Math;

然后:

Math.fn1( Math.fn2(...) );

我当然假设你的代码是而不是全局代码。 (如果您不熟悉JS中避免全局代码的概念,请阅读模块模式。)


你可以更进一步:

var Math = com.example.Math,
    func1 = Math.func1,
    func2 = Math.func2;

然后:

func1( func2(...) );

答案 2 :(得分:1)

我会做这样的事情:

var O = function() {
  var that = {};
  var PI = Math.PI;
  that.circ = function(r) {
    return 2*PI*r;  
  };
  return that;
};
var o = O();
console.log(o.circ(1));

请注意PI方法中如果没有Math命名空间,O.prototype.circ如何使用。

在JavaScript中,命名空间和对象之间没有区别,因此有些人认为Math不是命名空间,但由于JavaScript不支持这个概念,因此它就是命名空间。为com.mycompany.somelibrary

答案 3 :(得分:0)

一种选择是使用闭包来包装对象。它不一定会消除对象本身,但它有助于提高可读性,如果使用JS压缩器可以帮助减少输出文件大小:

(function(Math) {
    Math.function2(Math.function1(...));
}(com.example.Math);)

您还可以传入多个对象(例如:function(Math, Foo) {...}(com.example.Math, com.example.Foo))。


如果你想直接使用几个函数,只需将它们传递出来:

(function(function1, function2) {
    function2(function1(...));
}(com.example.Math.function1, com.example.Math.function2);)

但是,这会删除Math实例和函数之间的关系,因此如果您的方法依赖于实例变量,您可能会得到一些奇怪的行为。作为一个不起作用的例子,想象一下这个类:

com.example.Counter = {
    counter: 0,
    increment: function() { this.counter++; }
}