2013-10-17 86 views
0

我希望能夠通過class屬性的方法訪問class屬性的屬性。從coffeescript中的類的屬性中的方法訪問屬性的屬性

// lets say 
class foo 
    constructor:() -> 
    vars: { 
    bar: "somevalue" 
    }, 
    op: { 
    baz:() -> 
     #get the value of foo.vars.bar 
    } 

我該怎麼辦,它返回undefined如果我嘗試foo.vars.bar

編輯

對不起,我沒有把它那麼清楚,我想

baz:() -> 
    something = foo.vars.bar 

有一個簡單的方法來做到這一點,因爲

baz:() -> 
    something = foo.prototype.vars.bar 

工作正常。

+0

適用於我...確保先實例化對象。添加'x = new foo; console.log x.vars.bar'的結果是:'=>「somevalue」'。小提琴包括:http://jsfiddle.net/XL9aH/ – DRobinson

+0

看到編輯,對不起,沒有明確 –

+0

添加了一個答案,從這些嵌套方法中訪問類實例的方法。 – DRobinson

回答

2

我能想到的兩種方法可以做到這一點:總是通過foo的原型訪問foo.vars(如你發現)像這樣:

foo::vars.bar 

foo::是在CoffeeScript中foo.prototype快捷方式)

或者您可以確保bar的上下文在調用時綁定到foo的實例。這樣做的一個方法是將其綁定在foo構造:

class foo 
    constructor:() -> 
    @op.baz = @op.baz.bind @ 
    vars: { 
    bar: "somevalue" 
    }, 
    op: { 
    baz:() -> 
     console.log @vars.bar 
    } 

哪一個是最合適的可能取決於你是否要使用在所有課程中還是不一樣的vars對象。如果您希望baz的上下文不是foo實例,則第二個選項可能不適用。

2

一個可能的辦法是在範圍定義的父實例變量:

class foo 
    this_foo = null # So that the var is available everywhere within this context block 
    constructor:() -> 
    this_foo = @ 
    vars: { 
    bar: "somevalue" 
    }, 
    op: { 
    baz:() -> 
     this_foo.vars.bar 
    } 
console.log (new foo).op.baz() # => somevalue 

小提琴:http://jsfiddle.net/XL9aH/3/

該解決方案將使富的這種情況下,this_foo(重命名自己的喜好)至也可以在其他操作中訪問,而無需綁定它們或更改this(或咖啡腳本@)的值。