2012-01-01 127 views
2

如何從bar.foo()內部訪問somevar:'this is Foo'Javascript:從嵌套函數內部訪問父屬性

function Foo(){ 
    this.somevar='this is Foo'; 
} 
Foo.prototype={ 
    bar:{ 
     somevar:'this is bar' 
     ,foo:function(){ 
      console.log(this); 
     } 
    } 
} 

var instance = new Foo(); 
instance.bar.foo(); 

這裏是鏈接的jsfiddle: http://jsfiddle.net/jct8n/3/

+0

你可以訪問'Foo.prototype.somevar' - 或者我誤解了這個問題? – Lucero 2012-01-01 13:22:53

+0

@Lucero - 除了如果有人做了'var foo = new Foo();'然後'foo.somevar ='newValue'',那麼調用'foo()'仍然會打印'this is Foo' 'newValue'。 – aroth 2012-01-01 13:25:31

+0

更新了我的問題。 – Somebody 2012-01-01 13:54:48

回答

3

我想也許該語言的範圍規則不允許以任何直接的方式。我能想出的最好的建議,得到你想要的(短重命名somevar擺脫擺在首位的衝突中的)是使用apply()改變foo()內的this值,如:

var instance = new Foo(); 
instance.bar.foo.apply(instance); 

這裏有一個小提琴:

http://jsfiddle.net/jct8n/2/

+0

好吧,通過參數是一個選項。但是在嵌套對象中的每個方法上傳遞它是瘋狂的。如果這兩種情況都是必需的呢? :S – Somebody 2012-01-01 13:58:27

+0

@Beck'this'值爲您提供了一個上下文。如果你想要另一個,你需要把它作爲參數傳入... – 2012-01-01 14:03:15

1
console.log(Foo.prototype.somevar); 

另外,你應該考慮只重命名somevar變量,很容易讓你在找做什麼,之一,以及消除一些複雜和混亂。

+0

以及如何從當前實例訪問屬性? – Somebody 2012-01-01 13:44:03

+0

更新我的問題 – Somebody 2012-01-01 13:55:55

+0

我強烈建議僅使用此答案的第二部分 - 重命名一個「somvar」變量以消除衝突。 – ziesemer 2012-01-01 13:57:30