みかづきブログ その3

3ヶ月つづけてみました。

__proto__とprototypeの関係


JavaScriptのプロトタイプチェーン - みかづきブログ その3

前回 のつづきです。今回はは__proto__とprototypeの関係について書きたいと思います。

インスタンスが持つ存在しないメンバを探しに行くオブジェクトを便宜上 __proto__ と呼んでいますが、仕様ではありません。


var block = {
    item: "coin"
};

console.log(block.toString); // => function toString() { [native code] }


となる理由は、block.__proto__ に Object.prototype が設定されているからというのが前回の説明でした。
では、block.__proto__ に Object.prototype が設定されたのはいつなのでしょうか。



結論から書くと、オブジェクトを new したときです。

newの挙動を関数風に表すと、

function new(Konstruktor, arguments) {
    var instance = {}; // 空のオブジェクトを作成

    instance.__proto__ = Konstruktor.prototype; // prototypeを渡す
     var result = Konstruktor.apply(instance, arguments); // コンストラクタを実行

    if (result !== null && typeof result === "object") { // 返り値がobjectか確かめる
     return result;
    } else {
        return instance;
    }
}

という感じになります。

instance.__proto__ = Konstruktor.prototype; // prototypeを渡す

ここの部分でインスタンスの__proto__をコンストラクタのprototypeに設定しています。

なので、

var block = {
    item: "coin"
};

は、

var block = new Object();

block.item = "coin";

が行われていると考えれば、

new Objectの際に、block.__proto__ に Object.prototype をセットしているということになります。


いかがでしたでしょうか。
順番は前後しますが、コンストラクタのプロトタイプがインスタンスの__proto__にセットされることを逆手に取れば、コンストラクタのプロトタイプ以外のオブジェクトをセットすることも可能で、この現象を利用して継承的なことを実現することができます。


prototypeチェーンをつなげる - みかづきブログ その3



今回は以上となります。