javascriptで悩む。

欲しいもの
javascriptでequals()が欲しい、つまり、どういうことかというと

function class(name, age)
{
   this.name = name;
   this.age = age;
}
var a1,a2,a3;

a1 = new class("yamada",30);
a2 = new class("tanaka",35);
a1.name; // yamada
a2.name; // tanaka
a3 = a1;  // これはnameがyamadaでageが30のオブジェクト(a1)の別名
a3.name; // yamada
a1 == a3; // a1もa3も同じオブジェクトを指しているのでtrue
a1 == a2; // a1とa2は別のオブジェクトなのでfalse
a2.name = "yamada"; // a1.nameと同じ値を代入してみる
a2.age = 30; // a1.ageと同じ値を代入してみる
a2.name; // yamada
a2.age;  // 30
a1 == a2; // false!

値がa1とa2で同じであろうが、指しているメモリの位置が違うので最後の式はfalseとなる。
これを

// こんなのはない
a1.eauals(a2) // java風?
eq(a1, a2) // c/c++風?

とか、メモリの位置ではなくて中身を見て判定するような関数(か、演算子か、メソッド)。
たぶん、厳密に同値であることを判定するのは難しいはずだ。
だって、こういうことだってできる

a4 = new class("satou",100);
a4.name; // satou
a4.job = "salary_man"; // function class で定義していないプロパティの代入
a4.job; // salary_man 上で代入した値
a4.call = new function(who){ return "もしもし?" + who + "さんですか?"};
text = a4.call("yamada"); // 関数も代入できる
text; // もしもし?yamadaさんですか?

つまり、functionでオブジェクトの雛形は作れるが、参考程度で後からいくらでも付け足すことができる。
とりあえず、その場しのぎなのを承知で、こうしてみた。

function equals(a,b)
{
   var b_ret = true;
   for(var property in a){
      if(a[property] != b[property]) // a.property は a[property]と同じ
         b_ret = false;
   }
   for(var property in b){
      if(b[property] != a[property])
         b_ret = false;
   }
   return b_ret;
}

メソッドに、レキシカルクロージャなんかが入ってたらすぐにアウトになりそうなので、使える場面はかなり限られる。
が、とりあえず、今日やりたかった部分はこれで凌ぐことができた。



誰か作ってないかな、と、Google先生javascript eauqlsと入れると出てきた。
http://www.mamezou.com/tec/equip014.htm
javascriptSTL(の一部)を実装している。
面白いが、肝心のequalsがイマイチ。でも、面白い。