2017-06-13 60 views
1

我想了解類裝飾器中類裝飾器如何在我們希望替換構造器時工作。我已經看到了這個演示:在類型腳本中的類裝飾器

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 

一切都明白了,但此行:

newConstructor.prototype = originalConstructor.prototype; 

我們爲什麼這樣做?

+0

讓我們從你的代碼並不真正做你認爲它的事實開始。它不起作用。將ctor更改爲'constructor(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

的類,如:

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

目標ES5時被編譯成函數:

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'也是如此 –