2016-09-07 10 views
0

Mapをラップするオブジェクト用のカスタムゲッターとセッターメソッドが必要です。 どういうわけか、配列をキーとして使用すると、同じ値を持つときに等しいように、getterは同じ動作をします。彼らは2つの異なる参照ですが。 (FFとChromeでテスト済み)。同じ値を持つゲッターの2つの配列が「等しい」のはなぜですか?

JSFIDDLE

var Cons = function(){ 
    this.data = new Map(); 
}; 

Cons.prototype.initialiseGetterAndSetter = function initialiseGetterAndSetter(prop){ 
    Object.defineProperty(this, prop, { 
    get: function(){ 
     return this.data.get(prop); 
    }, 
    set: function(val){ 
     this.data.set(prop, val); 
    } 
    }); 
}; 

var obj = new Cons(); 

var arr1 = [1]; 
var arr2 = [1]; 
var arr3 = [2]; 

obj.initialiseGetterAndSetter(arr1); 

obj[arr1] = 1; 

document.getElementById('box1').innerText = obj[arr1]; // 1 as expected 
document.getElementById('box2').innerText = obj[arr2]; // expected undefined but got 1 
document.getElementById('box3').innerText = obj[arr3]; // undefined as expected 

あなたはゲッターそれ私が期待していた同じ参照に渡す何場合、それは問題ではありません見ることができるように。それは、それが私にとって奇妙な同じ値を持っているかどうかだけをチェックします。なぜそれがそのように振舞うのか私に説明できますか?

ありがとうございます!

EDIT マップに直接アクセスすると、期待される結果が返されます。

+0

をそれはおそらくにキーを変換し、 "1"を使用します。 – melpomene

答えて

1

オブジェクトのプロパティ名は文字列値のみにすることができます。あなたがObject.defineProperty()を呼び出すと、それはどちらも同じ値に強制されている場合arr1arr2に(文字列にあなたのprop値を強制します。

あなたはobj[arr1]obj[arr2]を使用してオブジェクトのプロパティにアクセスしようとすると、同じことが起こります。

あなたは、オブジェクトがマップを公開したい場合は

、そしてそれをそのマップにアクセスするメンバーを与える性質はあなたがそれらを使用しようとしている方法では動作しませんオブジェクト:。

var Cons = function(){ 
    this.data = new Map(); 

    this.get = function (key) { return this.data.get(key); }; 
    this.set = function (key, value) { this.data.set(key, value); }; 
}; 


// further down... 

obj.set(arr1, 1); 
+0

それが理由です。その奇妙な部分は、私が 'console.log(prop)'をgetterで表示すると起こりますが、その場合は文字列を記録する必要があります。 https://jsfiddle.net/dftc2tx3/4/ –

+2

それは奇妙ではありません。あなたの 'console.log()'行は、 'initializeGetterAndSetter()'に最初に渡された 'get'と' set'クロージャのスコープにある実際の 'prop'値にアクセスしています。 – JLRishe

+0

ああ、それは正しい –

2

JavaScriptオブジェクトのプロパティ名は文字列です。文字列以外を名前として使用すると、最初に文字列に変換されます。

arr1arr2あなたtoString()これは、あなたが"1"を得る[1]の内容、との両方の配列です。

arr3の配列も同様に"2"になります。したがってarr1arr2は同じプロパティにマップされ、"1"という名前で、arr3は異なるプロパティに割り当てられます。

関連する問題