覆盖现有的原型方法并保留相同的'这个'范围

时间:2016-12-11 22:24:21

标签: javascript methods prototype function-prototypes

我查看了多个参考文献,但我找不到解决方案!

我不会'可以访问原始原型代码

修改

我们假设我的代码库中已经存在以下内容:

(function(){
    function Test() {
        this.game = 'rods';
    }
    Test.prototype.fail = function() {
        setInterval(function() {
            console.log('A', this.game);
        }, 300);
    }
    var test = new Test();
    test.fail();
})();

我无法访问原始声明,这不在我的代码库之外,我试图实现的是一种覆盖fail方法的默认功能的方法,但仍保留{{{ 1}}关键字。

我尝试了很多不同的事情,我的目标与此类似:

THIS

我希望看到完全相同的输出,但输出现在应该以 B 为前缀,而不是 A

我希望这很清楚。

1 个答案:

答案 0 :(得分:0)

编辑:响应您的更新

这可能是对的。

Test.prototype.fail = function() {
    setInterval(function() {
        // since it's inside another function, 'this' no longer
        // refers to the instance of Test, but the global 'window'
        console.log('A', this.game);
    }, 300);
}

它必须像我认为的那样工作:

Test.prototype.fail = function() {
    setInterval(function() {
        console.log('A', this.game);
    }.bind(this), 300);
}

你说对象已经被实例化并且已经调用了fail()吗?如果您想要访问setInterval内的原始功能,,则无法 - 从功能外部无法访问其范围。如果没有原始clearInterval电话的返回值,您也无法setInterval

如果你想覆盖单个实例上的函数,你可以如果你有权访问该实例,但如果已经调用了fail(),你就无法做到清除原来的间隔。

test.fail = function() {
    setInterval(function() {
        console.log('B', this.game);
    }.bind(this), 1000);
};

但如果您的情况与上次编辑的情况非常相似,那么您既无法访问test实例,也无法访问setInterval中的时间间隔和函数,那么您无法按照自己的建议行事。< / p>