2017-02-01 11 views
2

Scala.jsのファサードは、(Three.js facadeから)次のようになります。Scala.jsネイティブJSタイプのネイティブのJavascriptのコンストラクタ

@js.native 
@JSName("THREE.Vector3") 
class Vector3 extends Vector { 
    def this(x: Double = js.native, y: Double = js.native, z: Double = js.native) = this() 
    var x: Double = js.native 
    var y: Double = js.native 
    var z: Double = js.native 

/* ... */ 
} 

Vector3を構築する機能の対応Javascript definitionがある:

function Vector3(x, y, z) { 

    this.x = x || 0; 
    this.y = y || 0; 
    this.z = z || 0; 

} 

私はcreating Scala.js facadesについてのドキュメントを読んでいますが、コンストラクタはここで簡単に述べられています。ファサードからのコードは実際のコードではうまくいきますが、定義が正しいのか、それがなぜ、どのように機能するのかは分かりません。

  • facadeには引数コンストラクタは存在しません。
  • 引数を指定したコンストラクタでは、引数なしコンストラクタが呼び出されます。それでも、オブジェクトは正常に構築されたように見え、メンバーは渡された値に設定されます。
  • コンストラクタは、すべての引数のデフォルト値としてjs.nativeを使用します。すべてのファサードでこのようにコンストラクタを定義する必要がありますか?

Esp。第2のポイントは私を混乱させています。これはどのように機能しますか? 3つのケースすべてで、コンストラクタでJSコードが生成された理由とその理由を知りたいと思います。

また、ファサードの書き方を変える方法を想像することもできます。それはより正確でしょうか?

class Vector3(var x: Double = js.native, var y: Double = js.native, var z: Double = js.native) extends Vector { 

/* ... */ 
} 

答えて

2

定義は正しいです。 JavaScriptのコンストラクタのためのファサードのルールは非常に単純に記載されている:コールに遭遇したとき、このような

new C(arg1, ..., argN) 

CようであるJavaScriptクラスは、これはCconstrjs.constructorOf[C]の評価結果をある

new Cconstr(arg1, ..., argN) 

に変換します。ネイティブJavaScriptクラスの場合、js.constructorOf[C]は、グローバルスコープ内でCの名前を検索します(または@JSNameまたは@JSImportのルールを適用します)。具体的には、あなたの例では、呼び出しが

new Vector3(3, 4, 5) 

は、呼び出しサイトを直接呼び出すため、コンストラクタの定義のは、完全に無関係であること、特に、

new <global>.THREE.Vector3(3, 4, 5) 

ノートに変換などThree.jsライブラリのJavaScriptコード。したがって、3-argコンストラクタが0-argコンストラクタを呼び出し、その引数を無視するという事実は、意味規則によって無視されます。呼び出しはScalaの型チェック規則に準拠する必要がありますが、意味的には関係ありません。

同様に、デフォルトのパラメータ値の実際の値は、意味的に無関係です。それらの存在により、パラメータはオプションになりますが、その値はコンパイラによって無視されます。このよう

new Vector3(3) 
としてコール

yzパラメータは完全に彼らと何をすべきかを決定するためにJavaScriptを残して、与えられたされていない

new <global>.THREE.Vector3(3) 

にJavaScriptで変換されます。

最後に、あなたの別の定義:

class Vector3(var x: Double = js.native, var y: Double = js.native, var z: Double = js.native) 

がちょうど等しく有効です。明示的な0引数のコンストラクタはありませんが、3つのオプションの引数を持つコンストラクタに0引数を渡すことで "アクセス"することもできます。しかし、この定義は確かに簡潔ですが、Scala-esqueをもう少し見ているので、私はそれを個人的に定義します。しかしそれはもはやではなく、最初のものよりもです。

関連する問題