2017-06-13 9 views
1

私はコンストラクタを置き換えたいときに、クラスのデコレータがTypescriptでどのように動作するかを理解しようとしています。我々はそれを行うのはなぜTypescriptのクラスデコレータ

newConstructor.prototype = originalConstructor.prototype; 

const log = <T>(originalConstructor: new(...args: any[]) => T) => { 
    function newConstructor(... args) { 
     console.log("Arguments: ", args.join(", ")); 
     new originalConstructor(args); 
    } 
    newConstructor.prototype = originalConstructor.prototype; 
    return newConstructor; 
} 

@log 
class Pet { 
    constructor(name: string, age: number) {} 
} 

new Pet("Azor", 12); 
//Arguments: Azor, 12 

すべてが理解されているが、このライン:私はこのデモを見てきましたか?

+0

あなたのコードがあなたが思うものを実際にしていないという事実から始めましょう。それは動作しません。 ctorを 'コンストラクタ(public name:string、public age:number)'に変更し、インスタンスメンバ( 'name'と' age')にアクセスしようとすると 'undefined'が返されます。適切な方法でこの質問をチェックしてください:https://stackoverflow.com/questions/39198811/can-we-change-the-constructor-behavior-using-typescript-class-decorators-i-mean –

+0

こんにちは、 このコードはインターネットからのものですが、動作するかどうかは気にしません。もっと多くの例で見たので、なぜこの行が必要なのかを知る必要があります。 – RiskX

答えて

1

のクラスが好き:ES5をターゲットとする場合

class Pet { 
    constructor(name: string, age: number) {} 
    dosomething() { 
     console.log("Something..."); 
    } 
} 

は機能にコンパイルされています。私たちはクラスを定義するための関数を使用するときは、

var Pet = (function() { 
    function Pet(name, age) { 
    } 
    Pet.prototype.dosomething = function() { 
     console.log("Something..."); 
    }; 
    return Pet; 
}()); 

見えることができたよう。メソッドは関数のプロトタイプに追加されます。

これは、あなたが新しいコンストラクタ(新機能)を作成しようとしている場合は、古いオブジェクトからすべてのメソッド(プロトタイプ)をコピーする必要があることを意味します

function logClass(target: any) { 

    // save a reference to the original constructor 
    const original = target; 

    // a utility function to generate instances of a class 
    function construct(constructor: any, args: any[]) { 
    const c: any = function() { 
     return constructor.apply(this, args); 
    }; 
    c.prototype = constructor.prototype; 
    return new c(); 
    } 

    // the new constructor behaviour 
    const newConstructor: any = function (...args: any[]) { 
    console.log("New: " + original.name); 
    return construct(original, args); 
    }; 

    // copy prototype so intanceof operator still works 
    newConstructor.prototype = original.prototype; 

    // return new constructor (will override original) 
    return newConstructor; 
} 

あなたは"Decorators & metadata reflection in TypeScript: From Novice to Expert (Part I)"

でより多くを学ぶことができます
+0

「ES5」とは関係ありません。 「ES6」でも同様です –

関連する問題