【问题标题】:Change the "this" only for a specific function call仅为特定函数调用更改“this”
【发布时间】:2015-11-24 19:59:20
【问题描述】:

假设我有这段代码(这是一个示例,已简化):

// A Thing that expands other thing can use it's origin Thing's "init".
ThingThatExpands.super = function() {
    this.__originThing.init.apply(this, arguments);
}

// I make a Car Thing and give a color and a speed.
var Car = Thing("Toy Car", {
    init: function(color, speed) {
        this.color = color;
        this.speed = speed;
    }
});

// Then I make a Racing Car, which inherits the color and speed properties from it's origin
// (that's "Car", of course), but also has a cool sound!
var RacingCar = ThingThatExpands(Car, "Toy Police Car", {
    init: function() {
        this.super("#00F", 180);
        this.sound = "Wee-ooh! Wee-ooh!"
    }
})

现在,由于“RacingCar”是“Car”的“子”,它有它的属性和一个很好的“超级”函数,可以用来调用“Car”的 init。

好的。问题是:既然“super”函数把“child”这个Thing作为“this”,它会改变“child”的属性,对吧?好的,这就是我们需要的。 但是......这也意味着“超级”将从“孩子”而不是“起源”事物中调用,这不应该发生(并且不会起作用)。

我能以某种方式“保护”“this.super”调用吗?

【问题讨论】:

  • 什么是东西?是来自图书馆还是应该是 ThingThatExpands?
  • 我觉得声音应该是this.sound = "Vrooom! Vroooom!" :)
  • 这是一些伪代码,但我正在尝试解决我的 OOP 库的问题。

标签: javascript class oop object call


【解决方案1】:

要更改特定函数的作用域,您必须将该函数绑定到所需作用域的对象。

因此,如果您希望调用 foo.bar(),但在 baz 的范围内,如果您希望函数立即运行,请使用 foo.bar.call(baz),如果您希望它使用该范围,请使用 foo.bar.bind(baz)在运行时在应用程序中调用它时。

【讨论】:

  • 这不是真正的问题。看,我在ThingThatExpands.super 函数中使用apply 来更改它的范围。问题是,这样做也会改变this.super 调用的范围,这是我不希望发生的。有什么方法可以检查是否有对 super 的调用并更改其范围?
  • "既然"super"函数把"child"的Thing赋予了"this",它会改变"child"的属性,对吧?"不会。它只会调用init 方法,但会从该对象的范围内调用。如果要调用该对象的init 方法,只需正常调用即可;除非您另有说明,否则它将自动绑定到自身。它现在所做的只是从你 applying 的那个对象的范围内调用它自己的 init 方法。
  • 查看Car 上的init,我正在更改this.colorthis.speed 属性。如果我创建一个Car 对象,它将更改为colorspeed,但如果我创建一个RacingCarthis.super 应该调用Car.init 函数并使其更改为(RacingCar ) 属性。但这并没有发生,因为在this.super 调用中,由于this 现在等于RacingCar,它会一遍又一遍地调用自己(导致堆栈溢出)。
  • 再次——不——更改函数范围只会从您定义的范围内运行相同的函数。它不会查看作用域对象是否具有要调用的同名方法。如果您尝试从其他对象继承方法,您可能会将 bind/apply 与原型继承混淆。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2015-01-11
相关资源
最近更新 更多