2012-03-08 80 views
1

下面是一些JavaScript代碼,我有:基於自己的變量創建Javascript對象?

var screenWidth = 1280; 
    var screenHeight = 720; 

    var shapeComtainer = { 
    name : "bender", 
    offsetX : 100, 
    offsetY : 100, 
    width : screenWidth - 2*offsetX, 
    height : screenHeight - 2*offsetY, 
    }; 

我越來越OFFSETX和OFFSETY沒有定義的錯誤。這是我正在計算寬度和高度的線。問題是我的寬度和高度取決於同一對象內的其他變量。

是否有一個更好/正確的方法來讓JavaScript對象表示諸如偏移量和大小信息之類的信息?

+0

可能重複的[JavaScript:訪問自己的對象屬性裏面的數組文字](http://stackoverflow.com/questions/3330686/javascript-access-own-object-property-inside-array-literal)(忽略數組文字部分,這是同樣的問題)。 – 2012-03-08 21:56:23

+1

這與JSON無關。 – 2012-03-08 21:56:50

+0

同樣重複http://stackoverflow.com/questions/3392033/referencing-other-properties-in-object-creation,http://stackoverflow.com/questions/7433395/object-referencing-its-own-property- on-initilization,http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations – 2012-03-08 21:59:59

回答

1

只是因爲沒有人提到它,到目前爲止,這也是ECMAscript5的getter功能一個典型的例子:

var defProps = Object.defineProperties; 

var shapeComtainer = { 
    name : "bender", 
    offsetX : 100, 
    offsetY : 100 
}; 

defProps(shapeComtainer, { 
    width: { 
     get: function(){ return screenWidth - 2*this.offsetX; } 
    }, 
    height: { 
     get: function(){ return screenHeight - 2*this.offsetY; } 
    } 
}); 

然後你可以訪問它想:

shapeComtainer.height; 
+0

非常優雅!也許我只是在尋找這種吸氣劑的概念。謝謝。 – bits 2012-03-08 22:24:10

4

從錯誤消息中可以看出,這是不可能的。雖然,你可以做到以下幾點:

var shapeContainer = { 
    name : "bender", 
    offsetX : 100, 
    offsetY : 100, 
    getwidth : function() { return screenWidth - 2 * this.offsetX }, 
    getheight : function() { return screenHeight - 2 * this.offsetY }, 
}; 

http://jsfiddle.net/XQGDB/

-1

必須使用shapeComtainer.offsetXshapeComtainer.offsetY

+2

'這個'雖然沒有提到對象。 – 2012-03-08 21:57:24

+0

@Felix Kling你是對的,但現在它的工作我在Firefox上測試它 – botzko 2012-03-08 22:02:09

+1

你究竟如何使用它?如果以這種方式:'var a = {b:42,c:a.b};'那麼它將不起作用。目前你想訪問'shapeComtainer'(或者在這種情況下是'a'''''''''''''''),它現在還不存在。如果你做的不同,那麼你應該發佈它。 – 2012-03-08 22:03:42

2

作爲除了Xander的答案是:也有可能,只使用一個功能一次包裹整個物體。

var shapeContainer = new function() { 
    this.name = "bender"; 
    // ... 
    this.width = screenWidth - 2 * this.offsetX; 
};