すべてのオブジェクトはプロパティを持っている ←わかる。
prototypeプロパティはコンストラクタ(に定義しているメソッド)のprototypeオブジェクトを参照している。←ちょっと何言ってるのかわからないです。
コンストラクタからインスタンスを生成して、その生成したオブジェクトにはprototypeプロパティがデフォルトでセットされている。そのprototypeプロパティの中身はコンストラクタに定義しているメソッドのprototypeオブジェクトなんですか?
ここで疑問なんですが、そのprototypeプロパティの中身はコンストラクタに定義しているメソッドのprototypeオブジェクトなのか?というところで、
prototypeオブジェクトを利用して定義したメソッドだけでなく、メソッドをそのまま関数リテラルとして定義したときも言えることなんでしょうか?私は違うような気がするのですが、どうなのでしょうか
頭がこんがらがります・・・
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
prototypeプロパティはコンストラクタ(に定義しているメソッド)のprototypeオブジェクトを参照している。
というのは違うかと思います。下で詳しく書きましたが、正しくは「(インスタンスの) _ proto _ プロパティは、コンストラクタのprototypeオブジェクトを参照している。」です。以下用語の復習がてらの解説です。
コンストラクタ
初期化演算子 new
付きで呼び出される( = 初期化される )ことを前提とした ただの関数 。コンストラクタ関数とも。他の言語で言うクラスのこと。
javascript
1function Klass(foo, bar) { 2 this.foo = foo; 3 this.bar = bar; 4 // コンストラクタは何も明示的にリターンしてはいけない 5} 6 7// Klassのメソッド 8Klass.prototype.getFoo = function () { 9 return this.foo; 10}
インスタンス
コンストラクタを初期化して生成されるオブジェクト。 _ _proto_ _
プロパティを持っている。
javascript
1// コンストラクタからの続き 2var inst = new Klass('This is foo!!', 'This is bar!!');
_ proto _ プロパティ
new演算子によって初期化されたインスタンスが持つプロパティ。 _ proto _ はコンストラクタのprototypeプロパティに代入されたオブジェクト(つまりメソッド)を参照する。 言い換えると _ proto _はコンストラクタのprototypeオブジェクトへのリンクを持つ。
javascript
1// インスタンスの続き 2 3/** 4 * インスタンスは、指定された関数オブジェクトが自分自身の中に見つからなかった 5 * 場合、自動的に _ _proto_ _ オブジェクト内を探しに行く。 6 * これをプロトタイプチェーンと呼ぶ。 7 */ 8inst.getFoo(); // 実際には inst.__proto__.getFoo() を呼び出している 9> 'This is foo!!'
(インスタンスの)prototypeプロパティの中身はコンストラクタに定義しているメソッドのprototypeオブジェクトなのか?への回答
コンストラクタのprototypeプロパティへの参照をもっているのは、 _ proto _ プロパティです。ゆえにインスタンスのprototypeプロパティの中身はコンストラクタとは関係がありません。
インスタンスのprototypeプロパティは、そのインスタンスをひな形(つまりクラス)として、さらにインスタンスを作成するときのために使えます(コンストラクタは単なる関数であることを思い出してください。どんなオブジェクトでもコンストラクタになりえます)。
javascript
1function Klass() {} 2 3Klass.prototype.foo = function () { 4 console.log('I am foo!!'); 5} 6 7var Klass2 = new Klass(); 8Klass2.foo(); // > 'I am foo!!' 9 10Klass2.prototype.bar = function () { 11 console.log('I am bar!!'); 12}; 13 14// prototypeプロパティに代入したメソッドは初期化するまで使えない 15Klass2.bar(); // > undefined 16 17// 明示的にprototypeプロパティを指定すれば使える。 18Klass2.prototype.bar(); // > 'I am bar!!' 19 20// 親だけでなく祖先のprototypeも継承している。 21var Klass3 = new Klass2(); 22Klass3.bar(); // > 'I am bar!!' 23Klass3.foo(); // > 'I am foo!!'
prototypeオブジェクトを利用して定義したメソッドだけでなく、メソッドをそのまま関数リテラルとして定義したときも言えることなんでしょうか?
ここまでの話の繰り返しになりますが、prototypeに代入した関数オブジェクトは、 new
演算子によって初期化することによって _ proto _ にセットされます。そのためインスタンスのprototypeオブジェクトに代入した関数オブジェクトは、初期化してまた新たなインスタンスを作るまでprototypeプロパティ経由でしか利用できません。
投稿2015/09/08 07:19
総合スコア30
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/09 15:10
2015/09/09 15:22
2015/09/10 06:49 編集
2015/09/10 06:40
2015/09/10 16:53
0
JavaScriptはプロトタイプベースのオブジェクト指向言語と言われる事がよくあります。関数を宣言すると、そのプロパティにprototype
が追加され、その関数をnew
すると、関数のprototype
のプロパティの要素をそのまま参照します。詳しくは参考リンク先を見てみてください。
投稿2015/09/07 16:58
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。