2012-06-16 78 views
1

我伸出通過prototype方法構造類的功能,但我有麻煩找出如何訪問構造函數類的即將是實例。如何使用構造函數進行原型設計時訪問實例?

比方說我們有以下類:

Bla = function() 
{ 
    this.a = 5; 
} 

夠簡單。現在,我會用很簡單的方法擴展它...

Bla.prototype.f = function(){console.log("Abdf.")};

new Bla().f(); //Logs "Abdf as expected."

但是,如果我想訪問a財產(5)?說我想擴展構造類是這樣的:

Bla.prototype.f2 = function(b){return b * here_are_the_problems.a};

顯然使用this指的是別的東西。我應該用什麼來代替?

+1

使用'this.a'。正常工作:http://jsfiddle.net/bNwuU/ –

+0

嗯,真的嗎?那麼好吧,顯然,我在控制檯中嘗試示例時弄亂了它。 [原型在Javascript]的 – corazza

+0

可能重複(http://stackoverflow.com/questions/11066328/prototyping-in-javascript) –

回答

2

使用this指在其上調用該方法的對象...

console.log(this.a); 

有幾種方法的this值可以設置。一個是它通常指的是函數被調用的對象,如果函數被調用爲對象的方法。

Bla = function() 
{ 
    this.a = 5; 
} 


Bla.prototype.f = function(){console.log(this.a)}; 

var bla = new Bla(); 

bla.f(); //Logs 5 

所以你可以看到,自f被稱爲由bla變量引用Bla實例的方法中,thisf值將被設置爲指的是同一個對象。

+0

特別提醒:如果您在使用對象方法的事件處理程序(在其他情況下,但事件處理是最常見的情況),該方法通常會在元素的上下文中調用。即在'element.onclick = bla_instance.some_method;',(如果使用jQuery事件綁定相同)的'this'關鍵字實際上指的是元件,而不是'bla_instance'。 – Flambino

+0

@Flambino:是的,但我不會說它使用元素的「範圍」。範圍是與'this'非常分離的問題,它涉及調用上下文。但是,沒有調用上下文與原始對象*的綁定(除非使用'Function.prototype.bind()'創建一個)*。 – 2012-06-16 20:07:20

+0

你是對的,我的意思是寫「上下文」 - 修正了我的評論。是的,'.bind'(或者'$ .proxy',如果你在老式的不支持綁定的瀏覽器中使用jQuery的話)就是解決方法。應該也提到過,我想:--P – Flambino

2

使用this關鍵字來訪問任何實例屬性或方法。 this代表實例。由於a是實例屬性和prototype方法是實例方法,它是在prototype訪問。

Bla = function() { 
    this.a = 5; 
}; 
Bla.prototype.foo = function() { 
    console.log(this.a); 
} 

var x = new Bla; 
x.foo(); // logs 5 
​ 

但是,如果我們直接添加一個方法來布拉...

Bla.bar = function() { 
    console.log(this.a); // ERRORRRRR 
} 

因爲酒吧是不是一個實例(prototype)方法。在這種情況下,它是一個Blastatic method沒有一個實例,並this指功能Bla.bar,在這種情況下不具有財產a

+0

您應該將'a'作爲對象的屬性,而不是作爲變量。原型方法中不能直接訪問'Bla'構造函數中的任何實際變量。 – 2012-06-16 20:04:42

+1

正確...錯誤類型 – Trevor

+0

@Trevor,什麼是「靜態方法」? – corazza

相關問題