読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

lengthが自動的に更新されるArrayみたいなオブジェクト

javascript

NodeListとかjQueryオブジェクトみたいに配列っぽいものを作る時、普通はlengthは自分で管理しなければいけない。
例えば、

Array.push(arrayLike,123);

みたいにすると、lengthをArray.pushがインクリメントしてくれるからいいけど、

arrayLike[arrayLike.length]=123;

とすると、lengthがおかしくなってしまって、困る。

なので、下のようにすると良いのではないか。

var a = {
  0 : "Hello",
  1 : "world",
  get length()
    Math.max.apply(this, [ - 1].concat([parseInt(i) for (i in this) if (!isNaN(i))])) + 1,
  set length(v) {
    var length=this.length;
    if (length < v)
      this[v - 1] = undefined;
    else if(length > v)
      for (var i in this) if (!isNaN(i) && i >= v)
        delete this[i];
    return v;
  }
};

console.log(a.length); // 2
a[10] = 42;
console.log(a.length); // 11
a.length = 1;
console.log(a[1]); // undefined