0

私が書いているプログラムでは、次のようなオブジェクト変数が必要です。

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

ただし、map.cubeと入力して、map.cube.polyと入力して必要なものを指定しない限り、デフォルトとしてpt3arraylocationを返すようにしたいです。

例:map.cubeは[0,0,0]を返し、map.cube.polyはオブジェクトキューブ内のオブジェクトpolyを返します。

前もって感謝します

4

5 に答える 5

3

map.cubeと入力して、map.cube.polyと入力して必要なものを指定しない限り、デフォルトとしてpt3arraylocationを返すようにしたい。

例: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)やのように文字列を必要とする関数や操作のパラメータとして使用すると"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 に答える