2011-12-28 49 views
0
function Foo(){ 

} 
Foo.prototype={ 
    foo:'some text' 
    ,bar:function(){ 
     console.log('Want to be able to retrieve foo of Foo',this.foo); 
    } 
} 

var instance=new Foo(); 
instance.bar.apply({}); 

這裏是鏈接的jsfiddle:訪問參考,而在不同的上下文中

http://jsfiddle.net/dnJFt/1/

我試圖用示波器把類建築物內包裝與var self裏面玩。並返回instance of Class後,它是指var self這樣的:

function Foo() { 
    var self; 
    function Foo_in(){ 

    } 
    Foo_in.prototype={ 
     foo:'some text' 
     ,bar:function(){ 
      console.log('Want to be able to retrieve foo of Foo',self); 
     } 
    } 
    return self=new Foo_in(); 
} 

var instance=new Foo(); 
instance.bar.apply({}); 

這裏是鏈接到的jsfiddle: http://jsfiddle.net/dnJFt/2/

但我的解決方案是壞的,因爲每一次我重建Class和它的原型方法。

有沒有更簡單的解決方案?

+0

使用bind函數:http:// stackoverflow。com/questions/8656106/why-is-function-prototype-bind-slow – kirilloid 2011-12-28 13:42:43

+0

你不能使用'Foo.prototype.foo'? – 2011-12-28 13:42:48

+0

這只是一個例子。如果它不在原型中呢? – Somebody 2011-12-28 13:51:09

回答

0

嘗試這種方式:

var Foo = (function() { 
    var Foo_in = function(){}; 
    Foo_in.prototype={ 
     foo:'some text', 
     bar:function(){ 
      console.log('Want to be able to retrieve foo of Foo',self); 
     } 
    } 
    var self = new Foo_in(); 
    return Foo_in; 
})(); 

有了這個代碼創建的自動調用功能範圍類,並聲明該範圍內的自變量,因此,這將是類方法裏面訪問,然後您將返回將分配給全局Foo變量的類的引用。通過這種方式,您可以獲得對自變量的引用,並且只創建一次類。

+0

將'Foo_in.prototype'對象存儲在'proto'變量中會更有意義。 – 2011-12-28 13:53:17

+0

http://jsfiddle.net/dnJFt/3/這是它不會爲我工作的原因。我只想在能夠訪問父上下文時使用另一個上下文。 – Somebody 2011-12-28 14:02:43

+0

是的,它不起作用,因爲self是類的一個實例,如果你想改變屬性,你必須改變自我實例,其他實例是不同的對象 – mck89 2011-12-28 14:12:12

0

你可以通過Foo.prototype對象作爲參數:

function Foo() {} 

Foo.prototype = { 
    foo: 'some text', 
    bar: function (proto) { 
     console.log('foo: ', proto ? proto.foo : this.foo); 
    } 
} 

var instance = new Foo(); 

所以....

instance.bar() // 'some text' 
instance.bar.apply({}, [ Foo.prototype ]) // 'some text' 

現場演示:http://jsfiddle.net/wpyZN/


另類用法:

instance.bar() // 'some text' 
instance.bar.apply({}, [ instance ]) // 'some text' 

現場演示:http://jsfiddle.net/wpyZN/1/


更新:我拿在封閉的解決方案:

var Foo = (function() { 
    function F() {} 

    var proto = F.prototype = { 
     foo: 'some text', 
     bar: function() { 
      console.log('foo: ', proto.foo); 
     } 
    } 
    return F; 
})(); 


var instance = new Foo(); 
instance.bar.apply({}); 

現場演示:http://jsfiddle.net/KT7vU/

所以,bar方法使用proto參考訪問foo值...

this.foo酒吧內不能正常工作(該申請,調用改變了this值,使其不再指向實例)。因此,我們必須爲原型對象提供一個手動引用,其中包含所需的foo值。最合適的方法是在我的代碼中提供的方法...

+0

忘記原型了。錯誤我想你是對的。唯一的解決方案是將實例本身作爲參數傳遞。 – Somebody 2011-12-28 14:13:37

+0

@Beck您嘗試訪問的值 - 「某些值」 - 被分配給「Foo.prototype.foo」。因此,顯然需要原型對象'Foo.prototype'才能訪問所需的值。如果你不想傳入原型對象,你可以傳入實例:'instance.bar.apply({},[instance]);' - 這也可以工作...... – 2011-12-28 14:19:26