質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

2228閲覧

prototypeについて

foo45

総合スコア106

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

2クリップ

投稿2015/09/07 16:16

すべてのオブジェクトはプロパティを持っている ←わかる。
prototypeプロパティはコンストラクタ(に定義しているメソッド)のprototypeオブジェクトを参照している。←ちょっと何言ってるのかわからないです。

コンストラクタからインスタンスを生成して、その生成したオブジェクトにはprototypeプロパティがデフォルトでセットされている。そのprototypeプロパティの中身はコンストラクタに定義しているメソッドのprototypeオブジェクトなんですか?

ここで疑問なんですが、そのprototypeプロパティの中身はコンストラクタに定義しているメソッドのprototypeオブジェクトなのか?というところで、
prototypeオブジェクトを利用して定義したメソッドだけでなく、メソッドをそのまま関数リテラルとして定義したときも言えることなんでしょうか?私は違うような気がするのですが、どうなのでしょうか

頭がこんがらがります・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/09/07 16:54

この質問において、Javaは関係ないです。Javaにはこの質問で述べられているJavaScriptのようなPrototypeという概念はありません。Javaタグを削除してください。
guest

回答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

uma

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

foo45

2015/09/09 15:10

丁寧に解説して下さってありがとうございます。 コンストラクタをnew演算子で初期化したものがインスタンスと呼ばれるオブジェクトなのですよね?インスタンスは__proto__プロパティを持っていて、その__proto__プロパティはコンストラクタのprototypeオブジェクトの中身を参照できる。ということは理解したのですが、このコンストラクタのprototypeオブジェクトはprototypeプロパティの、prototypeオブジェクトなのですか?
foo45

2015/09/09 15:22

hoge.prototype.hoge1 = function(){};というのは、hogeというコンストラクタのprototypeオブジェクトのhoge1プロパティのメソッド、ということになると思うのですが、このprototypeオブジェクト自体はhoge関数にprototype = {}のオブジェクトの状態でデフォルトでセットされているのか、ということが聞きたいです。 最後に説明して下さった「コンストラクタのprototypeプロパティへの参照をもっているのは、 _ _proto_ _ プロパティです。」というのは、hoge関数(コンストラクタ)がprototypeプロパティを持っていて、prototypeプロパティにprototypeオブジェクトがセットされているという風に捉えられるのですが、これだとコンストラクタ(関数)に、オブジェクトを作らずにプロパティを使えるという風に考えてしまうのですが、どうなのでしょうか?頭が悪くてすみません..
uma

2015/09/10 06:49 編集

> (コンストラクタの)prototypeオブジェクト自体はhoge関数にprototype = {}のオブジェクトの状態でデフォルトでセットされているのか 概ねその理解で正しいと思います。正確には `constructor` オブジェクトと、先述の `_ _proto_ _` がprototypeプロパティ内に予め定義されています。 `constructor` オブジェクトは、インスタンスのコンストラクタの同一性を確認するときなどに使います。 すべてのオブジェクトは原則[基本オブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects)を継承しているので、 `_ _proto_ _` がなかったり、あっても空ということはないということを思い出していただきたいです( `constructor` についても同じことが言える)。
uma

2015/09/10 06:40

> prototypeプロパティにprototypeオブジェクトがセットされているという風に捉えられるのですが、 念の為ですが、「prototypeオブジェクト」というオブジェクトはなく、この場合の「prototype」とはつまり、「ぷろとたいぷ」(ひな形)の意味かと思います(もしくは「prototypeプロパティにセットされたオブジェクト」)。和訳した情報ではこの辺が明確に区別されていないのでわかりにくいですが。 > コンストラクタ(関数)に、オブジェクトを作らずにプロパティを使える...どうなんでしょうか? これは「コンストラクタを初期化しなくても、コンストラクタのprototypeプロパティに代入したメソッドを直接利用できますか?」という意味でしょうか?もしそうであれば回答に示した例( Klass2.prototype.bar(); )の通り、正しくそのとおりかと思います。以下個人的にわかりやすかった比喩です。 「クラスベースのオブジェクト指向言語の場合、建築士は家の設計図を作成し、その設計図に基づいて家を建築する。プロトタイプベースの場合、建築士は家を設計してから、その家のような家を建築する。」(オライリー「シングルページWebアプリケーション」より一部改変して引用) すこし読みづらい本ですが、この本の第二章がJavaScriptのクセをとてもわかりやすく書いているので、立ち読みでもするともやもやが解決するかも知れません。 つまりクラスのつもりで作っているオブジェクトも、先述したように実際は単なる関数オブジェクトなので、初期化しなくても普通に使うことができます。大雑把に言えば、prototypeプロパティは、new演算子で初期化する時に限り特別なプロパティとして振る舞い、それ以外の時は他のプロパティと何ら変わらないものです。
foo45

2015/09/10 16:53

ありがとうございました。 本のほうでも詳しく勉強してみようと思います
guest

0

JavaScriptはプロトタイプベースのオブジェクト指向言語と言われる事がよくあります。関数を宣言すると、そのプロパティにprototypeが追加され、その関数をnewすると、関数のprototypeのプロパティの要素をそのまま参照します。詳しくは参考リンク先を見てみてください。

参考: JavaScriptの「プロトタイプ入門」

投稿2015/09/07 16:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問