JavaScript プロトタイプ
いつも思うけど、自分の中で言葉の定義が曖昧だと学習の効率がよく無いと思う。🤔
1 + 1 が 1.9 でも 2.1 でもいけないように、そこがはっきりしないと進めて行くうちに、
わからなくなってくるから大事な事ははっきりさせたいと思う。
そこで今日はこれ Prototype;
JavaScriptでは全てのオブジェクトはObjectオブジェクトを継承しているらしい。
このあたりはrubyのクラスの関係に似てるよね🙂
正確に言うとほぼ全てのオブジェクトはObject.prototypeプロパティに定義されたprototypeオブジェクトを継承しているって言う事。
prototypeオブジェクトは、全てのオブジェクトの作成時に自動的に追加される特殊なオブジェクトだよ。
物凄くわかりづらいよね、具体的にみていくよ。
まずは空の変数を定義してみる。
const obj = {}; console.log(obj.toString()); //"[object Object]
空のオブジェクトでもtoStringメソッドが呼び出せたよ、これはtoStringメソッドはObjectのprototypeオブジェクトに定義があるから使えるんだ。
このようなprototypeオブジェクトに組み込まれているメソッドはプロトタイプメソッドと呼びます。
これすごく大事な事、Objectのインスタンスは、このObject.prototypeオブジェクトに定義されたメソッドやプロパティをインスタンス化時に継承します。 つまり、オブジェクトリテラルやコンストラクターでインスタンス化したオブジェクトは、Object.prototypeに定義されたものが利用できるということです。
const obj = { "key" : "value" }; // `obj`インスタンスは`Object.prototype`に定義されたものを継承する // `obj.toString`は継承した`Object.prototype.toString`を参照している console.log(obj.toString === Object.prototype.toString); // => true // インスタンスからプロトタイプメソッドを呼び出せる console.log(obj.toString()); // => "[object Object]"
と言う事、 Object.prototypeに定義されているプロトタイプメソッドはインスタンス作成時に継承される為使える、だから最初に書いたオブジェクトリテラルで作られた空のインスタンスでもtoStringが使えるって事😤
やっぱり言語化するって大事な事だな、
頭の中でイメージした事を追っていくので学習効果が高いのかな。
to be continued