2017-06-01 5 views
3

私は誤解を招くかもしれませんが、typescriptsの遊び場を見ると、私は新しいオブジェクトを呼び出すたびにパフォーマンスが低下するかもしれないと感じるオブジェクト変数と共にクラッセのメソッドをラップすることに気付きました。Typescriptクラスのオブジェクトは、メソッドをラッピングすることによってパフォーマンスが低下しますか?

クラス

の活字体遊び場出力
var FatObject = (function() { 
    function FatObject(thing) { 
     this.objectProperty = 'string'; 
     this.anotherProp = thing; 
    } 
    FatObject.prototype.someMassivMethod = function() { 
     //many lines of code 
     //... 
     //... 
     //... 
     //....................... 
    }; 
    return FatObject; 
}()); 

var thing = 'example'; 
var objOne = new FatObject(thing); 
var objTwo = new FatObject(thing); 
var objThree = new FatObject(thing); 
var objFour = new FatObject(thing); 

私は大規模なメソッドを記述する場合、私はクラスから新しいオブジェクトを作成するたびに、私はまた、これらの大規模なメソッドをコンパイルされることを感じています。

新しいオブジェクトを作成するときに関数名の外にメソッドを宣言するのではなく、

古い方法:

function ThinObj(thing) { 
    this.anotherProp = thing; 
    this.objectProperty = 'string'; 
} 

ThinObj.prototype.someMassivMethod = function() { 
    //many lines of code 
    //... 
    //... 
    //... 
    //.................. 
} 

const thing = 'example' 
let objOne = new ThinObj(thing); 
let objTwo = new ThinObj(thing); 
let objThree = new ThinObj(thing); 
let objFour = new ThinObj(thing); 

誰もがあれば明確にすることはできます:

A:私はtypescriptです例では、メモリ内の関数の4種類をロードする(あるいは試作品を使用しているので、それらを上書きしています - 私はまだ私とshakeyだがプロトタイプの理解)。

B:Typescriptで複数のメソッドをまとめてコンパイルしている場合は、

ありがとう

答えて

3

クロージャは、クラス自体が作成されたときにのみ実行されます。これは直ちに呼び出される関数式(IIFE)と呼ばれ、関数の終了後に())または)()という特性で認識されます。}

これは一度だけ実行されるため、パフォーマンスに関して恐れることは何もないことを意味します(一般的に関数は人の思考よりも安い)。

さらに、クラス生成のこのパターンは、クラスの定義を単一の式でカプセル化するので、一般的で慣用的です。

重要なことに、TypeScript機能ではなくECMAScript機能であるクラスを正確に翻訳する必要もあります。 ES2015仕様(クラスフィーチャを追加した標準)に従うと、クラス定義は持ち上げられませんが、関数定義は常に行われているため、実際にはvarにIIFE結果が正しく変換されています。それのパフォーマンス上の情報のため

console.log(ThinObj); 
 
// Causes an error and therefore complies with the specification for ES2015 classes 
 
var t = new ThinObj('thing'); // Fails because var is `undefined` before initialization 
 

 
var ThinObj = (function ThinObj() { 
 
    function ThinObj(thing) { 
 
    this.thing = thing; 
 
    } 
 
    return ThinObj; 
 
}());

+0

おかげ対

console.log(ThinObj); // Does not cause an error and thus violates the specification for ES2015 classes var t = new ThinObj('thing'); // Succeeds because function is hoisted function ThinObj(thing) { this.thing = thing; }

を:コードでこれを説明するために

。これは私にとって非常に役に立ちました。 :)ちなみに、ボトムコードの例ではエラーは発生しませんでしたか? – Jonathan002

+0

問題ありません。いいえ、ランタイムエラーが発生するためです。 –

+0

@ Jonathan002私は実行可能なスニペットにサンプルを作成したので、実際のエラーを見ることができます。 –

関連する問題