2015-11-24 20 views
1

比方說,我有這樣的代碼(這是一個例子,簡化):更改「這個」只針對特定的函數調用

// 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」是「汽車」的「孩子」 ,它有它的屬性和一個很好的「超級」功能,可以用來調用「汽車的」初始化。

好的。問題是:由於「超級」功能給「孩子」的東西作爲「這個」,它會改變「孩子」的屬性,對吧?好的,那就是我們需要的。 但是......這也意味着「超級」將被稱爲「孩子」而不是「起源」的事情,這不應該發生(並且不會工作)。

我可以以某種方式「保護」「this.super」呼叫嗎?

+0

什麼是事情?這是來自圖書館還是ThingThatExpands? – thelastshadow

+0

我認爲聲音應該是'this.sound =「Vrooom!Vroooom!」':) – ochi

+0

這是一些僞代碼,但我試圖用我的OOP lib修復一個問題。 –

回答

2

要更改特定功能的範圍,必須將該功能綁定到所需範圍的對象。

所以,如果你想foo.bar()被調用,但是從baz範圍,使用foo.bar.call(baz)如果你想要的功能運行的權利,然後,或使用foo.bar.bind(baz),如果你想讓它使用範圍時,它是所謂的應用在運行時。

+0

這不是真的問題。 請參閱我在'ThingThatExpands.super'函數中使用'apply'來改變它的範圍。 問題是,通過這樣做,它也改變了'this.super'調用的範圍,這是我不想發生的事情。 有什麼方法可以檢查是否有一個調用「超級」發生並改變了範圍? –

+0

「既然」超級「功能給」孩子「這個東西作爲」這個「,它會改變」孩子「的屬性,對不對? 不會。它只是簡單地調用'init'方法,但是從該對象的作用域調用。如果你想調用該對象的'init'方法,只需調用它;除非您另有說明,否則它將自動綁定到自身。它現在所做的就是從你應用的那個對象的範圍中調用它自己的init方法。 – Benny

+0

看看'Car'上的'init',我改變'this.color'和'this.speed'屬性。如果我創建一個'Car'對象,它會改變它的'color'和'speed',但是如果我創建一個'RacingCar','this.super'應該調用'Car.init'函數並且修改它。 ('RacingCar')屬性。但是這沒有發生,因爲在'this.super'調用中,因爲'this'現在等於'RacingCar',它會一遍又一遍地調用自己(導致堆棧溢出)。 –

相關問題