NEST :: laboratory RSSフィード

引っ越しました。

http://ginpen.com

基本的にこちらの内容は残しておきます。
ただいくつかの記事については向こうへ持って行こうと思っています。


カレンダー
<< 2007/07 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

本家はこちら: NEST http://nest.l-w-l.info

. archive / . bookmark

HTML, CSS, JavaScript中心に興味あることあれこれを扱う技術系blogです。昔はそうでなかったので、古いのには妙なものも混ざってるかもしれません。

なお全ては自分が理解した事の覚書的文書であるため、事実に反する場合があります。気付かれた方はご指摘頂ければと思います。

書いてる人 : 高梨ギンペイ@横浜でSEやってます。Twitter→@ginpei_jp

2007/07/17

[][] JavaScriptで、オブジェクトプロパティのオブジェクト(配列等)のインスタンスが共有される

例1:

(オブジェクト同士を"==="で比較すると、インスタンスが同じなら真、異なるなら偽になる。)

function Hoge() {
    this.val;
    this.arr;
}
var hoge; hoge = new Hoge(); hoge.val=1; hoge.arr.push(null);
var hage; hage = new Hoge(); hage.val=9; hage.arr.push(null);
alert('hoge.val=' + hoge.val + '\nhoge.arr.length=' + hoge.arr.length + '\n'
      + 'hage.val=' + hage.val + '\nhage.arr.length=' + hage.arr.length + '\n'
      + 'hoge.valとhage.valは' + (hoge.val===hage.val ? '同一の' : '異なる') + 'インスタンス。' + '\n'
      + 'hoge.arrとhage.arrは' + (hoge.arr===hage.arr ? '同一の' : '異なる') + 'インスタンス。');

結果1:

hoge.val=1
hoge.arr.length=2
hage.val=9
hage.arr.length=2
hoge.valとhage.valは異なるインスタンス。
hoge.arrとhoge.arrは同一のインスタンス。

これではまったぜ……。どうりで無限ループになるわけだ。

で、別のインスタンスにするには、オブジェクトを生成してから改めて配列プロパティをnewすればよい。

例2:

function Hoge() {
    this.val;
    this.arr;
}
var hoge; hoge = new Hoge(); hoge.val=1; hoge.arr = new Array(); hoge.arr.push(null);
var hage; hage = new Hoge(); hage.val=9; hage.arr = new Array(); hage.arr.push(null);
alert('hoge.val=' + hoge.val + '\nhoge.arr.length=' + hoge.arr.length + '\n'
      + 'hage.val=' + hage.val + '\nhage.arr.length=' + hage.arr.length + '\n'
      + 'hoge.valとhage.valは' + (hoge.val===hage.val ? '同一の' : '異なる') + 'インスタンス。' + '\n'
      + 'hoge.arrとhage.arrは' + (hoge.arr===hage.arr ? '同一の' : '異なる') + 'インスタンス。');

結果2:

hoge.val=1
hoge.arr.length=1
hage.val=9
hage.arr.length=1
hoge.valとhage.valは異なるインスタンス。
hoge.arrとhoge.arrは異なるインスタンス。

何故こういう挙動になるかは、JavaScriptで変数やオブジェクトがどのように扱われているか(実装されているか)と、prototype/プロトタイプ チェインを知れば、自然と理解できるはず。

[] script.aculo.usが動かない →解決

なんだろうね。prototype.jsは1.5.1.1、script.aculo.usは1.7.0。サンプルコードを書くと、IEだとスタック オーバーフローなるエラーを吐き、Fxでは一度きりしか動かない。

便利そうなので使いたいんだけど。また今度調べる。

以下追記 22:27

よく見たらダウンロードページに

Not compatible with Prototype 1.5.1.

script.aculo.us 1.7.1 beta 3 if you use Prototype 1.5.1

script.aculo.us - downloads

と書いてあった……。

というわけでVer.1.5.0を入れてみたところ、正常に動作。よかった。(→ Prototype JavaScript Framework | Download Prototype