Javascript根据变量引用更改变量

时间:2012-05-05 13:28:10

标签: javascript

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

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

提前致谢

5 个答案:

答案 0 :(得分: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中arrays aren't really arrays。它们只是具有自动length属性的对象,以特殊方式处理一类属性名称(所有数字属性),并使Array.prototype备份它们。当然,您可以向任何对象添加属性。

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

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

答案 1 :(得分:1)

最好的方法就是这样说:

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

答案 2 :(得分: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__

答案 3 :(得分:0)

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

  • 当用作需要字符串的函数或操作的参数时,如alert(map.cube)"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中,函数是与其他函数类似的对象,因此您不仅可以调用它们,还可以为它们设置字段和方法。

答案 4 :(得分:0)

T.J. Crowder是对的。根据他的回答,我想说你也可以像这样分配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 */
};