2012-04-02 54 views
3
var foo = { 
    x: 1, 
    y: (function() { 
    return ++this.x; 
    })() 
}; 
console.log(foo.y); // undefined rather than 2 

我們可以說我希望能夠在不使用foo.y()的情況下引用foo.y。那可能嗎?如何在同一個對象內的匿名函數中引用對象屬性?

以上顯然不起作用,我假設這是因爲封閉引用不同的

+0

它不「變」'this'可言,這是一個IIFE(立即調用函數表達式),並沒有得到比全球'this',其他任何其他'this'背景下,其可能是'window',如果你在瀏覽器中工作,就像它是。 – 2012-04-02 02:28:41

+0

你想foo.y總是返回任何x是因爲x的變化,或只是它被初始化爲? – 2012-04-02 02:29:36

+0

@BradHarris是的,比方說,我希望foo.y在任何特定時刻總是包含++ this.x的值,但我不想使用parens(例如foo.y())。 – oevna 2012-04-02 02:33:06

回答

6

如果您要訪問Ÿ作爲一個屬性,而不是一個功能,並使其返回foo.x的電流值,我能想到的是使用getter/setter方法的唯一途徑,這是一部分ES5規範,並在大多數現代瀏覽器中採用(但如果您支持舊版瀏覽器則不太適用)。

var foo = { 
    x: 1, 
    get y() { 
     return this.x; 
    } 
}; 
2

您不聲明y作爲函數,而是作爲函數調用的結果。它應該是:

var foo = { 
    x: 1, 
    y: function() { 
    return this.x; 
    } 
}; 

或者,如果你想只分配給X的Y值:

var foo = { 
    x: 1, 
    y: this.x 
}; 

UPDATE:這是不可能使X Y的代名詞。當你聲明y時 - 它可以是一個值或一個函數。它不能是對另一個值的引用。

+0

給y賦值的函數,而不是x的值。在你的例子中,我將不得不使用foo.y()。 – oevna 2012-04-02 02:31:18

+0

然後只需要y:this.x如果你只想要值,而不是函數。 – 2012-04-02 02:34:07

+0

這會工作,這不是我想要完成的。我試圖將函數的返回值賦給一個屬性,同時引用該函數中同一對象的屬性。 – oevna 2012-04-02 02:37:46

0

foo.y不是功能。 foo.y定義爲foo.x

+0

我應該更清楚。我想能夠引用foo.y,而不是foo.y()。我提供的示例代碼是我未能完成的。我可以刪除閉包,刪除匿名函數的「即時調用」,並且foo.y()可以工作,但這不是我正在尋找的行爲。 – oevna 2012-04-02 02:30:01

+0

你能提供一個你想如何引用foo.y的例子嗎? – 2012-04-02 02:33:53

+0

我修改了我原來的問題。 – oevna 2012-04-02 02:39:54

0
var foo = new Object(); 
foo.x = 1; 
foo.y = function() { return this.x; }; 
console.log(foo.y()); 

,或者如果你想調用y,而你foo定義:

var foo = new Object(); 
foo.x = 1; 
foo.y = x; 
console.log(foo.y); 
+0

你的第一個例子使用foo。y(),第二個不會把函數的返回值放到foo.y中。 – oevna 2012-04-02 02:42:55

+0

我的第二個例子實際上就是你的例子。你有一個立即執行的函數,它將它的值設置爲y,它與x相同。 – mbrevoort 2012-04-03 00:24:16

+0

對不起,我提供了一個令人困惑的例子。 x可以是引用同一對象的另一個屬性的任何東西;例如,x的值增加1(在我更新的例子中)。 – oevna 2012-04-03 15:30:03

1

爲什麼不直接返回X直接,如果你不希望使用Y()的功能?您返回函數的唯一原因是您實際上需要修改x的結果。

var foo = { 
    x: 1, 
    y: (function() { 
      return this.x; 
    })()}; 
console.log(foo.x); // 1 
相關問題