我理解如何进行模块扩充工作。但是,我不知道如何在新方法的实现中获得对象引用。
例如,我想扩充es2015 Map界面。
在我的代码中我有
declare global{
interface Map<K, V> {
newMethod(g: K): V;
}
}
工作正常。我可以在其他代码中看到新方法。
然而,当我尝试实现这个新方法时,我不知道如何获取Map实例的引用,所以我可以调用其他方法(例如get或keys)
我试过
Map.prototype.newMethod = k => {
...
let leys = this.keys();
...
}
但这不起作用。
我怎样才能做到这一点?
答案 0 :(得分: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();
...
}
答案 1 :(得分:0)
改为使用普通功能。
Map.prototype.newMethod = function newMethod() {
let leys = this.keys();
};
箭头函数不仅仅是'酷炫的新函数语法',你应该有意识地做出有意识的决定,你希望箭头函数语义超过正常的函数语义。
主要箭头函数没有this
或arguments
的绑定,而是绑定到最近的词法范围。