2017-01-01 11 views
1

我明白如何做模塊擴充工作。但是,我不知道如何在新方法的實現中獲取對象引用。Typescript模塊擴充 - 獲得對實例的引用

例如,我想增加es2015 Map接口。

在我的代碼有

declare global{ 
    interface Map<K, V> { 
     newMethod(g: K): V; 
    } 
} 

它工作正常。我可以在我的其他代碼中看到新方法。

然而,當我嘗試實施這種新方法,我不知道如何在地圖上實例的引用,這樣我就可以調用其他方法(如獲取或鑰匙)

我試過

Map.prototype.newMethod = k => { 
    ... 
    let leys = this.keys(); 
    ... 
} 

但這並不奏效。

我該如何做到這一點?

回答

1

將方法添加到原型時,不能使用箭頭函數。
此代碼:

Map.prototype.newMethod = k => { 
    let leys = this.keys(); 
} 

編譯爲:

var _this = this; 
Map.prototype.newMethod = function (k) { 
    var leys = _this.keys(); 
}; 

正如你所看到的,_this沒有指向正確的實例。
即使您將它編譯爲es6並且它將保持箭頭功能,它也會表現相同,因爲這只是箭頭函數的工作原理。

相反,它應該是:

Map.prototype.newMethod = function(k) { 
    ... 
    let keys = this.keys(); 
    ... 
} 
+0

哦,那很簡單。我不知道在正常功能和箭頭功能之間存在細微差別。感謝@Nitzan的教訓! – daspr2

0

使用正常功能來代替。

Map.prototype.newMethod = function newMethod() { 
    let leys = this.keys(); 
}; 

箭頭的功能不只是「很酷的新功能語法」,你應該要超過正常功能的語義箭頭功能語義故意意識的決定。

主要的箭頭函數沒有綁定爲thisarguments,它將被綁定到最接近的詞法範圍。