3

Java静的インポートに相当するものはJavaScriptにありますか? たとえば、Math次のようなクラスがある場合

com.example.Math = function() {

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

}

現在、これらの関数の一部は自然にチェーン化されており、ある関数への出力が別の関数への入力になります。私は次のようなことができます

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

これは少し見苦しいですが、私は本当に次のようなことをしたいと思っています:

function2(function1())

しかし、function1 と function2 をグローバル名前空間に入れたくありません。これは可能ですか?

4

4 に答える 4

3

はいあります。と呼ばれていwithます。

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

それは言った:

使用withは推奨されておらず、ECMAScript 5 strict モードでは禁止されています。推奨される代替方法は、一時変数にアクセスするプロパティを持つオブジェクトを割り当てることです。

例えば:

var m = com.example.Math;
m.function2(m.function1());
于 2013-01-14T22:50:46.630 に答える
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なしで がどのように使用されているかに注目してください。MathO.prototype.circ

JavaScript では、名前空間とオブジェクトの間に区別がないためMath、名前空間ではないと主張する人もいますが、JavaScript はこの概念をサポートしていないため、com.mycompany.somelibrary.

于 2015-09-21T16:16:44.120 に答える
1

どうですか:

var Math = com.example.Math;

その後:

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

もちろん、あなたのコードはグローバルコードではないと仮定しています。(JS でグローバル コードを回避するという概念に慣れていない場合は、モジュール パターンについて読んでください。)


さらに一歩進むことができます:

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

その後:

func1( func2(...) );
于 2013-01-14T22:54:35.597 に答える
0

1 つのオプションは、クロージャーを使用してオブジェクトをラップすることです。必ずしもオブジェクト自体を排除するわけではありませんが、読みやすくするのに役立ちます。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++; }
}
于 2013-01-14T22:59:53.360 に答える