prototypeと__proto__

prototypeと__proto__についてよく分からないので調べてみると、以下のページを見つけました。
http://www.mollypages.org/misc/js.mp
このページの図が全てだと思いますが、自分用に勝手にページを翻訳してみました。誤訳とかあるかも分かりません。。

                                                                                                                                      • -

ポイント
・全てのインスタンスはそれを作ったファンクションのプロトタイプオブジェクトを継承する。
Mozilla/Konqueror には __proto__ という、そのインスタンスを作成したファンクションのプロパティオブジェクトを指すプロパティがある。
・__proto__ プロパティの有無にかかわらず、全てのオブジェクトは オブジェクトを作った関数のprototype プロパティを使う。
prototype プロパティは 関数そのものを指すconstructor プロパティを持つ。
・prototype は関数によって作成されたオブジェクト/インスタンスに継承されるプロパティのために使用される。関数そのものはprototypeを使用しない。
ただし、関数そのものはオブジェクトであるから、その作成者である Function オジェクト のprototypeを継承している。

function Foo() {};
var f1 = new Foo();

Foo.prototype.x = "hello";
f1.x    //=> hello
Foo.x  //=> undefined

Foo.prototypeをFooによって作られるオブジェクトのプロパティをセットするために使用している。f1.prototypeをf1のプロパティをセットするために利用するのではない。


・どのprototypeオブジェクトもObject()コンストラタによって呼ばれる。だからそのprototypeは Object.prototype を持つ。それ故全てのインスタンスはObject.prototypeを結局のところ継承しているといえる。

・全てのオブジェクトは自動的に自分自身にそれらのプロパティが定義されているかのようにprototypeチェインでプロパティを読む。

function foo() { } 
f1 = new foo();
f2 = new foo();
foo.prototype.x = "hello";

f1.x  => "hello"
f2.x  => "hello";

f1.x = "goodbye";   //f1.x は foo.prototype.xを隠す

f1.x  => "goodbye"  //"hello" は f1 のみ隠れている。
f2.x  => "hello"

delete f1.x
f1.x  => "hello";   //再びfoo.prototype.x が見えるようになる。

foo.prototype.x = "goodbye";
//すると
f1.x  => "goodbye"
f2.x  => "goodbye";


・Function.__proto__ は Function.prototypeを指す。
つまり Function.constructor === Function

・Object.__proto__.__proto__.constructor == Object
だから Object instanceof Object == true

                                                                                                                                      • -

Default prototype objects can be replaced with another user created object. While doing so, the constructor property must be set manually to replicate what the javascript runtime does behind the scence with the default prototype object.

function foo() { } ; var f1 = new foo();
f1.constructor === foo.prototype.constructor === foo
//replace the default prototype object
foo.prototype = new Object();
//now we have:
f1.constructor === foo.prototype.constructor === Object
//so now we say:
foo.prototype.constructor == foo
//all is well again
f1.constructor === foo.prototype.constructor === foo

この文章だけいまいち分かりません…。spidermonkeyで実行させてみるとどれもfalseな訳ですが。。

js> function foo(){};var f1 = new foo();
js> f1.constructor === foo.prototype.constructor
true
js> f1.constructor === foo
true
js> foo.prototype.constructor === foo
true
js> f1.constructor === foo.prototype.constructor === foo
false
js> foo.prototype = new Object();
[object Object]
js> f1.constructor === Object
false
js> foo.prototype.constructor === Object
true
js> foo.prototype.constructor === foo
false
js> f1.constructor ==== foo
true
js> f1.constructor === foo.prototype.constructor === foo
false
js> f1.constructor === foo.prototype.constructor === Object
false

あとまぁ以下に適当なめも。

                                                                                                                                      • -

JavaScriptのデータ型には、数値・文字列・理論値・オブジェクトがある。
基本データ型にはそれぞれ対応したオブジェクトクラスが用意されている。
これらは基本データ型を包みこむラッパーとして用意されている。
・Number
・String
・Boolean

js> a = "abc"
js> typeof(a)
string
js> b = new String("abc")
js> typeof(b)
object

指定された文字列のプロパティやメソッドにアクセスすると、JavaScriptがその文字列に対応したStringラッパーオブジェクトを内部的に生成し、このオブジェクトに対してメソッド等を適用する。生成されたオブジェクトは不要になると回収される。
コンストラクタ定義時のデフォルトのprototypeオブジェクトはObjectの直接のサブクラスとなる。あるクラスのサブクラスにするには明示的に指定する必要がある。
(ex) foo.prototype = new bar();
ここでnew演算子のする動作はこれ
Object()はFunction()によって生成されるので、ObjectクラスのコンストラクタはFunction()である。

js> (0).constructor
function Number() {
    [native code]
}
ja> (0).constructor.constructor
function Function() {
    [native code]
}

js> x = Object();
[object Object]
js> x.constructor
function Object() {
    [native code]
}
js> x.constructor.constructor
function Function() {
    [native code]
}


その他参考になるサイト
http://blog.morrisjohns.com/illumination_on_javascript_prototypes.html
JavaScriptのnewって本当にいらない子? - あと味
constructorとprototype.constructorがわからなくなった - 宇宙野武士は元気にしているか