2012-03-08 79 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; 
};