2015-10-26 66 views
1

在對象文字中使用getter和setter時,我看不到在Typescript中訪問外層「this」範圍的簡單方法。考慮以下幾點:TypeScript:從字面getter訪問外層「this」

class Report { 
    stuff: any[]; 

    options = { 
     length: 10, 
     get maxLength() { return REPORT.stuff.length } 
    } 
} 

REPORT想成爲的Report對象的實例的引用。我意識到我可以通過在構造函數中設置選項並使用var REPORT = this或類似的方法解決此問題,但似乎不夠優雅。有沒有辦法更乾淨地做到這一點?

回答

3

我意識到,我可以在構造函數中設置選項,並使用VAR REPORT =這種或類似的解決這個問題,但似乎不雅

相反,你可以利用構造函數設置選項options *正在構造函數中定義的事實。因此,存儲thisoptions

class Report { 
    stuff: any[] = []; 

    options = { 
     _report: this, 
     length: 10, 
     get maxLength() { return (this._report as Report).stuff.length } 
    } 
} 

let foo = new Report(); 
foo.stuff = [1,2]; 
console.log(foo.options.maxLength); // 2 
+0

玩了一下後,我也回答了這個問題。在我看來,這仍然不是完美的,但我猜這是目前我們能做的最好的。 –

+0

需要演員陣容。然而'self = this'從測試中遺留下來了......因此現在被刪除了,謝謝 – basarat

+0

@JohnnyHK沒有演員,它是'任何'和不安全的 – basarat

1

您可以利用lambda表達式的this綁定。

class Report { 
    stuff: any[]; 

    options = { 
     length: 10, 
     maxLength:() => this.stuff.length 
    } 
} 

編譯成

var Report = (function() { 
    function Report() { 
     var _this = this; 
     this.options = { 
      length: 10, 
      maxLength: function() { return _this.stuff.length; } 
     }; 
    } 
    return Report; 
})(); 

編輯:這使得代替吸氣功能像你原本。我認爲這是一個錯字,直到現在,當我剛剛瞭解到這是有效的JavaScript。

+0

不幸的是,這並不在同一個對象結果作爲我的榜樣。我想maxLength是一個_value property_,在你的例子中,這是一個函數。爲了在我的例子中訪問該值,你需要在你的''report.options.maxLength''中寫入,你需要'report.options.maxLength()' –

+0

@YonaAppletree:今天,我瞭解到javascript有值屬性。我以前沒見過他們。我知道胖箭頭lambda不能給出名字,所以我沒有看到製作這樣一個getter的優雅方式。 – recursive

+0

我也剛剛瞭解了對象文字中的getters/setter。我知道你可以用Object.defineProperty在已經定義的對象上完成它,但我不知道它在文字中是有效的。我猜這就是TypeScript獲取其屬性方法的語法(或者實際調用的任何語法)的地方。 –