javascript中有什么东西相当于java静态导入吗?例如,如果我有Math
类看起来像
com.example.Math = function() {
function1(...) {}
function2(...) {}
}
现在,这些函数中的一些自然地链接在一起,使得输出到一个是另一个的输入。我可以做点像
com.example.Math.function2(com.example.Math.function1());
这看起来有点丑陋,我真的想做点什么:
function2(function1())
但我不想将function1和function2放在全局命名空间中。这可能吗?
答案 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++; }
}