2017-02-23 3 views
1

TypeScriptでは、単純なクラスPerson3が存在するとします。 typescriptがクラスをコンパイルする方法と通常の匿名関数との実際の違いは何ですか?

class Person3 { 
    name: string 
    constructor(public name: string) { 
     this.name = name 
    } 
} 

我々は手でJavaScriptを書いていた場合、私たちはこのような関数を書くかもしれません:

var Person3 = function(name){ 
    this.name = name; 
} 

ひとつでも純粋関数の構文に行くかもしれない:

function Person3(name){ 
    this.name = name; 
} 

しかし、活字体以下にコンパイルします。

var Person3 = (function(){ 
    function Person3(name){ 
    this.name = name; 
    } 
    return Person3; 
}()); 

匿名関数を保持する式を保持する変数。この無名関数はcontainsであり、名前が変数の名前と一致する名前付き関数を返します。私が知る限り、無名関数はインラインと呼ばれます。呼び出されると、指定された関数が返され、式のかっこに返されるときに評価されます。

なぜですか?理由があるに違いないと確信していますが、ここで何が起こっているのかを本当に理解することができないような気がします。なぜ単にname = anonymousコンストラクタを使用しないのですか?ネストされた関数が私たちに与えるメリットは何ですか?

答えて

2

これはなぜですか?

class A { 
} 
class B extends A { 
} 

...(ES3/5標的を有する)にtranspiledれる:

var __extends = // ... 
var A = (function() { 
    function A() { 
    } 
    return A; 
}()); 
var B = (function (_super) { 
    __extends(B, _super); 
    function B() { 
     return _super.apply(this, arguments) || this; 
    } 
    return B; 
}(A)); 

注意パラメータ_super参照

生命維持継承の場合であります親クラス。

しかし、このような蒸散は間もなく廃止される予定です。最新のJSエンジンの場合、JavaScriptを手で書きたい場合は、次のように書くことができます:

class Person3 { 
    constructor(name) { 
     this.name = name 
    } 
} 
関連する問題