2015-05-28 93 views
1

讓我們想象一下,我們有一個JavaScript類:獲取一個類的公共屬性而不創建它的一個實例?

var Person = (function() { 
    function Person(name, surname) { 
     this.name = name; 
     this.surname = surname; 
    } 
    Person.prototype.saySomething = function (something) { 
     return this.name + " " + this.surname + " says: " + something; 
    }; 
    return Person; 
})(); 

我想重複其方法和屬性。我沒有問題的方法。

var proto = Person.prototype, 
     methods = Object.keys(proto); 

    // iterate class methods ["saySomething"] 
    for (var i = 0; i < methods.length; i++) { 
    // do something... 
    } 

我的問題是當我想要遍歷其屬性:

var proto = Person.prototype, 
     targetInstance = new Person(), // this is my problem! 
     properties = Object.getOwnPropertyNames(targetInstance), 

    // iterate class properties ["name", "surname"] 
    for (var i = 0; i < properties.length; i++) { 
    // do something... 
    } 

,我發現的唯一辦法就是創建一個實例和使用Object.getOwnPropertyNames。我想使用這段代碼作爲框架的一部分,所以我不能控制其他開發人員定義的類。我想避免創建一個實例的需要,因爲如果構造有某種類似的驗證:

function Person(name, surname) { 

    if(typeof name === "undefined" || typeof surname === "undefined"){ 
    throw new Error() 
    } 

    this.name = name; 
    this.surname = surname; 
} 

我將無法使用上面的代碼。你知道是否有可能獲得一個類的公共屬性而不創建它的一個實例?

+1

「據我所知,'不'。」你需要能夠詢問「Prototype」,而且我不知道你會怎麼做。 。 。 –

回答

1

你知道是否有可能獲得一個類的公共屬性而不創建它的一個實例?

如果你正在談論運行他們沒有,不是沒有難看黑客喜歡toString(它給你的函數體的string表示)。

但是,您可以在編譯時使用TypeScript語言服務獲取這些代碼,然後執行代碼生成以幫助運行時(https://github.com/Microsoft/TypeScript/wiki/Using-the-Language-Service-API)。

這些都不是微不足道的。

+0

我在想'toString()',但我沒有意識到語言服務API謝謝你的答案 –

1

屬性在對象構造它們之前不存在。 如果您的類看起來像:

var Person = (function() { 
    Person.prototype.name = null;  
    Person.prototype.surname = null; 
    function Person(name, surname) { 
     this.name = name; 
     this.surname = surname; 
    } 
    Person.prototype.saySomething = function (something) { 
     return this.name + " " + this.surname + " says: " + something; 
    }; 
    return Person; 
})(); 

你會看到姓名太多,但你當然不能看着這樣的對象計數。

相關問題