【问题标题】:Overwrite existing prototype method and retain the same 'this' scope覆盖现有的原型方法并保留相同的“this”范围
【发布时间】:2016-12-11 22:24:21
【问题描述】:

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

我无权访问原始原型代码

编辑:

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

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

我无权访问原始声明,这在我的代码库之外,我想要实现的是一种覆盖失败方法的默认功能的方法,但仍保留 THIS 关键字的实例.

我尝试了很多不同的东西,我的目标是这样的:

setTimeout(function() {
    Test.prototype.fail = function() {
        setInterval(function() {
            console.log('B', this.game);
        }, 1000);
    }
}, 1000);

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

为前缀

我希望这很清楚。

【问题讨论】:

  • 不要.bind,一切都应该正常工作
  • 它不起作用@JaromandaX
  • 不是当你像 Utilities.prototype.add() 这样调用它时......你需要实例化一个像 var x = new Utiltiies() 这样的对象,然后 x.add() 将执行你的代码
  • 我无法创建新实例,它需要在原来从@JaromandaX 调用的地方调用它
  • 更改原型不会停止间隔-但如果您在一秒钟后test.fail(),您应该在控制台上看到B rods-初始失败函数输出A undefined的原因是因为@间隔回调中的 987654331@ 不是您认为的那样(在您的代码案例中,它是窗口,如果您处于严格模式,则未定义)

标签: javascript methods prototype function-prototypes


【解决方案1】:

编辑:响应您的更新

这不可能。

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 内部的原始函数,你不能——它的作用域不能从函数外部访问。如果没有原始setInterval 调用的返回值,您也不能clearInterval

如果您想覆盖单个实例上的函数,您可以,如果您有权访问该实例,但如果 fail() 已被调用,则无法清除原始间隔.

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

但是如果你的情况真的像你上次编辑所说的那样,那么你既不能访问test 实例,也不能访问setInterval 中的函数,那么你就不能按照你的建议去做。

【讨论】:

  • 我不能改变原来的原型定义,你已经改变了结构!
  • @ShannonHochkins 你的问题还不是很清楚。所以你说你不能修改第一个Test.prototype.fail (不能像写的那样正确),但你想通过覆盖原型来影响它?请更新您的问题以更清楚。
  • 第一次编辑解释了这一切,抱歉没说清楚,这次编辑怎么样?
猜你喜欢
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2019-10-04
  • 2014-11-14
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多