こんなやりとりがあった。
dankogaiの指摘の一つ、「MyObject.prototype = { /* ... */ }は避けるべし」について。
MyBox.prototype = Box.prototype; // ここで継承しているのに MyBox.prototype = { // ここで台無し speed:8 };
指摘には同意するが、上の例だと親の Boxにも MyBoxと共通のクラス変数 speedが追加されている。
amachangの反論にあるように、継承するなら次の書き方の方が優れている。
MyBox.prototype = new Box; // new Box()と同じ
ところで、amachangはこう続けている。これがプロトタイプ継承の正しい形式であり
MyBox.prototype = {}; MyBox.prototype = new Object;
指摘を受けた上段の書き方は下段のシンタックスシュガーなので両方とも Objectからの正しい継承方法である。このことがわかっていれば、他から継承しておきながら Objectからも継承して台無しにするような間違いは犯さない。(だから必要に応じて違う書き方をすれば良いし、必要がなければ .prototype={}と書いても良い)。
でも違う理由で MyObject.prototype = {}; という書き方は避けている。 理由は一つで
MyObject = function(){}; MyObject.prototype = {/* MyObjectの定義 */}; alert(new MyObject().constructor); // function Object(){ [natiive code] } と表示
constructorプロパティが MyObjectではなくなってしまっている。これは MyObject.prototype = new MyParent; としたときも同じで constructorは MyParentになる。
constructorプロパティだけを気にするなら
MyObject.prototype = { constructor:MyObject.prototype.constructor };
というように明示的にコピーすればごまかせるが、一時しのぎ感がぷんぷんしている。(constructor以外のプロパティが追加されたらその都度書き換えるの?)
だから、継承の仕方で逆につっこまれてしまったが、dankogaiが提示した 3つの方法に自分は同意していて、そのうちの一つ目を自分は使っている。
http://blog.mf-davinci.com/mori_log/archives/2005/12/index.php
勘違いしていた。水面より上にある氷が融ければ水面が上がると思っていた。
重さで考えてみる。
氷の全体の重さは、水面下に沈んでいる氷の体積と同じ量の水の重さと等しい。(浮力)
氷が融けてすべて水になるとどうなるか。水面下にあった氷と同じだけの体積を占めることになる。(同じ重さの水は同じ体積)
水面は上昇しない。
ところで、氷の水面に浮かんでいる部分は、水が凝固したときに増加した体積分だという見方はしたことがなかった。(凡人以下)
いやになるなあ。