基于变量引用的 Javascript 更改变量

Javascript change variable based on variable reference

本文关键字:变量 Javascript 改变 引用 于变量      更新时间:2023-09-26

在我正在编写的程序中,我需要一个看起来像这样的对象变量:

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 将返回对象多维数据集中的对象多边形

提前致谢

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

例如:map.cube 将返回

[0,0,0],map.cube.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;更多。

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

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

这是不可能的。也许你可以玩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__

没有办法完全按照你想要的方式做到这一点 - 如果你请求一个对象(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 中,函数与其他任何对象一样都是对象,因此您不仅可以调用它们,还可以为它们设置字段和方法。

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 */
};