2015-12-22 9 views
5

にデコレータを持つコンストラクタをラップするデコレータを持つクラスをラップするプロセスは、スーパークラスは、クラスのプロパティことにアクセスすることができないようにします。どうして?どのように適切に活字体

  1. はまったく同じことを行う必要があり、新たなコンストラクタを持つクラスのコンストラクタを置き換えデコレータを作成します。

    は、私はいくつかのコードを持っています。

  2. プロパティを持つ基本クラスを作成します。
  3. ラッピングデコレータで基本クラスをラップします。
  4. ベースクラスを拡張するクラスを作成します。
  5. 拡張クラスのプロパティにアクセスしようとします。これが失敗する部分です。ここで

コードです:

function wrap(target: any) { 
    // the new constructor 
    var f: any = function (...args) { 
     return new target(); 
    } 

    f.prototype = target.prototype; 
    return f; 
} 

@wrap 
class Base { 
    prop: number = 5; 
} 

class Extended extends Base { 
    constructor() { 
     super() 
    } 
} 

var a = new Extended() 
console.log(new Extended().prop) // I'm expecting 5 here, but I get undefined. 

私は、これは一般的にどちらかのプロトタイプや活字体は私が把握していないこと、それらを扱う特定の方法のいくつかのニュアンスであると確信しています。

+0

が、私はこの記事からメソッドとプロパティのデコレータについて学んだ:http://blog.wolksoftware.com/decorators -metadata反射・イン・typescriptです-から-初心者ツー専門家 - パートII – TSV

答えて

10

私のためにこのコードworks

function logClass(target: any) { 
    // save a reference to the original constructor 
    var original = target; 

    // the new constructor behaviour 
    var f : any = function (...args) { 
    console.log("New: " + original.name); 
    return original.apply(this, args) 
    } 

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

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

@logClass 
class Base { 
    prop: number = 5; 
} 

class Extended extends Base { 
    constructor() { 
     super() 
    } 
} 

var b = new Base() 
console.log(b.prop) 

var a = new Extended() 
console.log(a.prop) 
+0

私のために動作しません。このエラーが発生します: 'TypeError:クラスコンストラクター 'new'なしでベースを呼び出すことはできません – tmuecksch

1

run code after and before constructor() with a decorator好きなら:

function ClassWrapper() { 
    return function(target: any) { 
     // save a reference to the original constructor 
     var original = target; 

     // the new constructor behaviour 
     var f: any = function (...args) { 
      console.log('ClassWrapper: before class constructor', original.name); 
      let instance = original.apply(this, args) 
      console.log('ClassWrapper: after class constructor', original.name); 
      return instance; 
     } 

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

     // return new constructor (will override original) 
     return f; 
    }; 
} 
@ClassWrapper() 
export class ClassExample { 
    public constructor() { 
     console.info('Running ClassExample constructor...'); 
    } 
} 

let example = new ClassExample(); 

/* 
CONSOLE OUTPUT: 
ClassWrapper: before class constructor ClassExample 
Running ClassExample constructor... 
ClassWrapper: after class constructor ClassExample 
*/ 
+0

私にとってはうまくいきません。この例外を投げます: 'TypeError:クラスコンストラクターClassExampleは 'new'なしで呼び出すことはできません。この行にはエラーがスローされます: 'let instance = original.apply(this、args)' – tmuecksch

関連する問題