0

在我正在编写的程序中,我需要一个如下所示的对象变量:

var map {
    cube: {__pt3arraylocation__:[0,0,0], poly: new Object()},
    other: {__pt3arraylocation__:[1,0,0], poly: new Object()}
};

但是,我希望能够键入 map.cube 并让它返回pt3arraylocation作为默认值,除非我通过键入 map.cube.poly 来指定我想要的

例如:map.cube 将返回 [0,0,0] 并且 map.cube.poly 将返回对象立方体中的对象 poly

提前致谢

4

5 回答 5

3

我希望能够键入 map.cube 并让它返回 pt3arraylocation 作为默认值,除非我通过键入 map.cube.poly 来指定我想要的

例如:map.cube 将返回 [0,0,0] 并且 map.cube.poly 将返回对象立方体中的对象 poly

你不能在 JavaScript 中做到这一点。

但是,作为替代方案,值得注意的是,您可以根据需要向数组添加任意属性。例如:

var map {
    cube:  [0,0,0],
    other: [1,0,0]
};
map.cube.poly = {};  // {} is the same as `new Object()` but not subject to people...
map.other.poly = {}; // ...overriding the `Object` symbol

然后map.cube为您提供数组,并map.cube.poly为您提供存储在该数组中的对象。

这怎么可能?因为在 JavaScript 中,数组并不是真正的数组。它们只是具有自动length属性的对象,以特殊方式处理一类属性名称(所有数字名称),并Array.prototype对其进行备份。当然,您可以向任何对象添加属性。

这样做没有文字语法,这就是为什么我必须在上面的对象初始化程序之后使用赋值来完成它。但这是完全有效的。我一直将它用于交叉索引数组。

如果您这样做,请确保您没有for..in错误地使用;更多

于 2012-05-05T13:31:16.980 回答
1

我想说的最好的方法是这样的:

var map {
    cube: [0,0,0],
    other: [1,0,0]
};
map.cube.poly = new Object();
map.other.poly = new Object();
于 2012-05-05T13:34:43.313 回答
0

这是不可能实现的。也许你可以玩 toString()

var map = {
    cube: {
      __pt3arraylocation__:[0,0,0], 
      poly: new Object(), 
      toString : function() {
         return this.__pt3arraylocation__.toString()
      }
    },
    other: {__pt3arraylocation__:[1,0,0], poly: new Object()}
};

map.cube == '0,0,0'
map.cube.split(',') == map.cube.__pt3arraylocation__
于 2012-05-05T13:35:29.057 回答
0

没有办法完全按照你的意愿去做——如果你请求一个对象(即map.cube),你就会得到一个对象。但是,有几种方法可以做类似的事情。

  • 当用作需要字符串(如alert(map.cube)or )的函数或操作的参数时"sometext" + map.cube,通过调用函数将对象转换为字符串toString。因此,您可以定义,例如:

    map.cube.toString = function() { return this.__pt3arraylocation__.toString(); };
    
  • 如果在需要数字时在上下文中使用对象,则会发生类似的事情。在这种情况下,它被转换为valueOf()。所以你可以使用,例如

    map.cube.valueOf = function() { return this.__pt3arraylocation__.length; };
    
  • 或者,如果您将对象定义为函数,则可以通过函数调用获取默认值

    var map = {
       cube: function() {
           return map.cube.__pt3arraylocation__;
       }
    }
    
    map.cube.__pt3arraylocation__ = [0,0,0];
    map.cube.poly = new Object();
    
    alert(map.cube.__pt3arraylocation__); // 0,0,0
    alert(map.cube.poly);                 // [object Object]
    alert(map.cube());                    // same as map.cube.__pt3arraylocation__
    

    如您所见,在 JavaScript 中,函数与其他任何对象一样都是对象,因此您不仅可以调用它们,还可以为它们设置字段和方法。

于 2012-05-05T13:39:11.500 回答
0

TJ克劳德是对的。根据他的回答,我想说你也可以map.cube这样分配

var map = { 
             cube: function(){ 
                     var val = [0,0,0];
                     val.poly = {}; 
                     return val; }()
          };

或更多值:

function polyval(val){
    val.poly = {}; 
    return val; 
}
var map = { 
            cube: polyval([0,0,0]),
            other: polyval([1,0,0]),
            more: polyval([1,1,0])
            /* ... etc */
};
于 2012-05-05T13:39:18.777 回答