2008/11/21(金)length プロパティ

配列の要素数ではなく,インデックスの最大値+1を指す.
そのため,

var a = new Array();
a[0] = 0; // length -> 1
a[1] = 1; // length -> 2
a[100] = 100; // length -> 101
a[2] = 2; // length -> 101

になる...

要素数を知りたい場合カウントするしかないの?

var count = 0;
for(var i in ary){ count++; }

2008/11/20(木)メソッド定義のマイルール

コンストラクタの定義

class = function(o){
}

プロトタイプで定義

ここに定義するのは,オブジェクト名付きで呼び出されるメソッド類.thisを信用することができるもの.class内部からしか呼び出さないものは_を付ける.(_付きのメソッドを外部から呼び出しても動作は保証しない)

class.prototype = {
  func1: function(){
  },
  _func2: function(){
  }
}

クラス名付きで定義

イベントなどにより呼び出されるメソッド類.thisを信用できない.必要ならば,引数に自分自身を指すオブジェクトを入れる.

class.func3 = function(){
}

2008/11/19(水)javascriptのpro...

と同じ罠にはまってしまった...
なにやってるんだか.

A = function(){}
A.prototype = {
  pos: {x:0, y:0}
}

a = new A();
b = new A();

a.pos.x = 10; a.pos.y = 20;
b.pos.x = 30; b.pos.y = 40;

a.pos.x; // -> 30;
a.pos.y; // -> 40;
b.pos.x; // -> 30;
b.pos.y; // -> 40;

正しくは↓の通り。

A = function(){
  this.pos = {x:0, y:0};
}
A.prototype = {
  pos: null
}

a = new A();
b = new A();

a.pos.x = 10; a.pos.y = 20;
b.pos.x = 30; b.pos.y = 40;

a.pos.x; // -> 10;
a.pos.y; // -> 20;
b.pos.x; // -> 30;
b.pos.y; // -> 40;

一度,以前作ったプログラムも見直した方がいいかもしれない

2008/11/06(木)javascriptのprototypeではまった

微妙にはまった罠

A = function(){}
A.prototype = {
  data: new Array(),
  push: function(a){
    this.data.push(a);
  },
  pop: function(){
    return this.data.pop();
  }
}

a = new A();
b = new A();

a.push('1st');
a.push('2nd');
b.push('3rd');

a.pop(); // -> '3rd'
b.pop(); // -> '2nd'
a.pop(); // -> '1st'

当然と言えば当然だけど、ポインタ的なものが見えにくいので原因がわかるまで時間がかかりました。というか、C++のクラスとJavascriptのプロトタイプの違いがわかった気がする。正しくは↓の通り。

A = function(){
  this.data = new Array();
}
A.prototype = {
  data: null,
  push: function(a){
    this.data.push(a);
  },
  pop: function(){
    return this.data.pop();
  }
}

a = new A();
b = new A();

a.push('1st');
a.push('2nd');
b.push('3rd');

a.pop(); // -> '2nd'
b.pop(); // -> '3rd'
a.pop(); // -> '1st'

オブジェクトを生成するたびに data そのものを正しく初期化する必要あり。