错了这个'扩展地图的参考

时间:2015-12-28 07:51:40

标签: javascript dictionary typescript map-function

我正在尝试在Map<K, V>接口上编写一个简单的方法。这就是我迄今所做的: MapExtensions.ts:

interface Map<K, V> {
    clone(): Map<K, V>;
}

Map.prototype.clone = () => {
    var self = this;
    console.log(self);

    let retval = new Map();        
    self.forEach((value, key) => {
        retval.set(key, value);
    });

    //for (let [key, value] of self.entries()) {
    //    retval.set(key, value);
    //}
    return retval;
};

然而,在测试方法的过程中,我最终发现this参数中的引用错误地引用了Window个对象,因此,self.forEach不起作用,而测试它的时候说self.forEach is not a function(与self.entries()相同)。这是我的测试脚本:

test("clone test", () => {
    //Arrange
    const source = new Map().set(1, "abc").set(2, "def").set(3, "ghi");

    //Act
    const actual = source.clone.bind(source)();//This fails.
    //const actual = source.clone();//This too fails.

    //Assert
    console.log(actual);
    console.log(expected);
    deepEqual(actual, source, "Cloned correctly");
});

其他信息:

  1. 以下是生成的JavaScript输出:

    var _this = this;//It seems this is causing the problem.
    Map.prototype.clone = function () {
        var self = _this;
        var retval = new Map();
        console.log(self);
        self.forEach(function (value, key) {
            retval.set(key, value);
        });
        return retval;
    };
    
  2. 我使用的是Visual Studio 2015,以及typescript的默认JavaScript输出生成器。

  3. 如何成功完成这项工作?

1 个答案:

答案 0 :(得分:2)

那是因为你正在使用箭头功能。当您需要访问this时,请不要使用箭头功能。

Map.prototype.clone = function() { ... }