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

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

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

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

Q&A

解決済

4回答

160閲覧

オブジェクトAのコンストラクタは何を作成するか

slimat

総合スコア57

JavaScript

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

0グッド

1クリップ

投稿2019/12/04 10:07

こんにちは.

JavaScriptにおいて, あるオブジェクトAの"コンストラクタ"と言った場合,その"コンストラクタ"はオブジェクトAを作成したコンストラクタを指すのでしょうか. それともAの子オブジェクトを作成するコンストラクタを指すのでしょうか.

宜しくお願い致します.

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

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

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

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

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

guest

回答4

0

ベストアンサー

オブジェクトAのコンストラクタは何を作成するか

  1. オブジェクトAが「A と命名された関数オブジェクト」なら自身を指します。
  2. オブジェクトAを生成した他の関数オブジェクトがあるなら、その関数オブジェクトを指します。

それともAの子オブジェクトを作成するコンストラクタを指すのでしょうか.

継承の関係について一切触れていない質問内容で、子オブジェクト を持ち出されても回答者は困惑するだけです。


開発者コンソールは修学目的でも使えます

  • オブジェクトのツリーを開いて眺めてみる
  • シンプルなコードを書いて試してみる
  • 気になるプロパティを console.log() で表示してみる

dameo さん回答のコードを拝借して遊んだ例:

javascript

1function Original(){ 2 this.a = 0; 3} 4var A = new Original(); 5console.log( A.prototype ); // undefined 6console.log( A.__proto__ ); 7// [object Object]: {constructor: function Original(){this.a=0}} Edgeの場合 8// {constructor: f Original(), __proto__: } Chromeの場合 9// { constructor:function Original(), <prototype>: Object{...} } Firefox の場合 10 11console.log( A.__proto__ === Original.prototype ); // true 12console.log( A.__proto__.constructor === Original ); // true <== ご質問の本質

別の質問で提示されていた継承とプロトタイプチェーン の内容を思い出してください。

  • 現在、非推奨だが実装は __proto__
  • 混同してはいけないとの説明。

上記のような 実験を繰り返すだけ でも、次のような違いが感じられるはずです。

  • コンストラクタ関数の prototype プロパティは、すべてのインスタンス用
  • 生成されたオブジェクトの __proto__ プロパティは、そのインスタンス用

投稿2019/12/05 09:09

AkitoshiManabe

総合スコア5432

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

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

slimat

2019/12/20 04:59

ご回答ありがとうございます. ご回答の2・3行目の語尾"指します"は"作成します"と解釈して宜しいでしょうか.
AkitoshiManabe

2019/12/20 05:18 編集

いえ。Javascript の関数オブジェクトは 、new 演算子とともに記述するとコンストラクタとしても振る舞います。なので、文字通り「コンストラクタ関数のことでもある」という意味で、「指します」と回答しました。引用した箇所からいうと、新しいオブジェクト(インスタンス)を作成します。
slimat

2019/12/24 12:22 編集

ご返信ありがとうございます。 申し訳ございません。 スマホとパソコンで改行までの文字数が異なることを忘れていました。2・3行目ではなく、ご回答のナンバリングされた1と2と解釈して下さい。 また、 ”指します”という表現について理解ができていません。 質問なのですが、 オブジェクトAを生成した他の関数オブジェクトがあるなら、その関数オブジェクトはnewをつけて呼べばコンストラクタとなり、オブジェクトAを作成する という理解は正しいのでしょうか。
AkitoshiManabe

2019/12/24 12:36

申し訳ありません。回答時点では、「コンストラクタは何か?」との勘違いしていました。 ですので、作成するのは?の正しい回答になっていませんでした。 1. は var a = new A() という用法が適切であり、A がコンストラクタである。 2. は A.__proto__.constructor === Other となることから var A = new Other であり、Otherがコンストラクタである。 という内容で「(コンストラクタを)指します」と回答しています。誤解を招いてしまいました。 『新しいオブジェクト(インスタンス)を作成します』と返信しましたが、 1. では a を 2. では A を作成しているという解釈です。 > 質問なのですが、(中略)という理解は正しいのでしょうか。 その理解で正しいですよ。 2. については、var A2 = new A.__proto__.constructor() も実行できます。
slimat

2019/12/24 15:46

1. が理解できていなかったのですが, 理解できました. ご丁寧にありがとうございました.
guest

0

JavaScriptにおいて, あるオブジェクトAの"コンストラクタ"と言った場合,その"コンストラクタ"はオブジェクトAを作成したコンストラクタを指すのでしょうか. それともAの子オブジェクトを作成するコンストラクタを指すのでしょうか.

JavaScript

1function Original() { 2 this.a = 0; 3} 4var A = new Original();

この状況で、
関数OriginalはオブジェクトAのコンストラクタか?と聞かれたら、答えはNoです。
関数OriginalはオブジェクトOriginalのコンストラクタか?と聞かれたら、答えはYesです。
JavaScriptの関数は同時にオブジェクトでもあります。
newを付けて呼べばコンストラクタに変身します。

先程のコードは以下でも全く同じです。

JavaScript

1class Original { 2 constructor() { 3 this.a = 0; 4 } 5} 6var A = new Original();

ただし、constructorとして宣言された場合は、newを伴わずに関数として呼び出すことは出来ません。

投稿2019/12/04 13:11

dameo

総合スコア943

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

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

slimat

2019/12/20 00:50 編集

ご回答ありがとうございます。 > この状況で、 関数OriginalはオブジェクトAのコンストラクタか?と聞かれたら、答えはNoです。 > newを付けて呼べばコンストラクタに変身します。 上の文からすると、下のコードのOriginalはコンストラクタだけれども、 var A = new Original(); 下のコードのOriginalは関数オブジェクト ということでしょうか。 function Original() { this.a = 0; }
dameo

2019/12/20 05:32

いいえ。 Originalは関数ですよ。 関数はオブジェクトでもあります。 newをつけて呼べばコンストラクタとして機能するというだけです。 Dogは犬です。 犬は動物でもあります。 盲導をつければ盲導犬として機能する、みたいな話です。
slimat

2019/12/24 12:04 編集

ご返信ありがとうございます。 > この状況で、 関数OriginalはオブジェクトAのコンストラクタか?と聞かれたら、答えはNoです。 とありますが、この状況で、オブジェクトAのコンストラクタは逆に何になるのでしょうか?
dameo

2019/12/24 12:22

ありません
dameo

2019/12/24 12:24

なんというか、何日かおきに問答やめてもらえませんか?
slimat

2019/12/24 12:30

JavaScriptでは、 オブジェクトがconstructorプロパティを持っているかをhasOwnPropertyメソッドで調べ、trueになる場合のみ、そのconstructorプロパティの値の関数オブジェクトがそのオブジェクトのコンストラクタといえるということでしょうか。
slimat

2019/12/24 12:36

申し訳ございません。 ご回答の分からないところを調べていると時間がかかってしまいました。 これからは早く返信するように意識します。
dameo

2019/12/24 12:44

constructorプロパティにはそのオブジェクトを生成したコンストラクタへの参照が入っているだけですよ
slimat

2019/12/24 15:20 編集

> constructorプロパティにはそのオブジェクトを生成したコンストラクタへの参照が入っているだけですよ これは, 自身のプロパティではない(hasOwnPropertyメソッドでfalseとなる)にも通用するのでしょうか. つまり, ご回答内のコードでいうと, オブジェクトAを作成したコンストラクタはOriginalであり, A.__proto__オブジェクトを作成したコンストラクタもOriginalとなるのでしょうか. また, > 関数OriginalはオブジェクトOriginalのコンストラクタか?と聞かれたら、答えはYesです。 と書かれてありますが, Original.constructorはコンソールで見ると ƒ Function() { [native code] } とあり, Functionそのものとなっています. f Original() {}とは出力されないので, 関数OriginalはオブジェクトOriginalのコンストラクタとはいえないのではないでしょうか.
dameo

2019/12/24 15:24

newに続くconstructorで生成したケースの話です。 私に質問するのではなく、MDN資料やECMASCRIPT仕様を読んでください。 私は資料に書いてある内容を全て質問できる便利グッズではありません。
slimat

2019/12/24 15:50

承知致しました. 仕様書をあさりたいと思います. 長い間ありがとうございました.
dameo

2019/12/24 16:30

所感ですが、あなたはちゃんと理解しようとしている点は良いのですが、自分の質問はアバウトで、推測を強要するものであるにも関わらず、他人の言葉には一切の推測をしない点がいけません。ありえない選択肢を自分で除外することで、共通の暗黙の前提を作れないのであれば、自分の質問から限定的にすべきです。 個人的にprototypeや[[Prototype]]を持ち出して説明するのは(伝わらないから)好きではないので、極力使用せず、一般的なオブジェクト指向用語で感覚的に伝える方法を用いましたが、prototypeや[[Prototype]]で理解できるなら、それに越したことはありません。 端的に言えば、私の説明では、 XXXX.prototype.constructorがXXXXのコンストラクタ で、 XXXX.constructorはXXXXを生成したコンストラクタを参照する と言っています。
slimat

2019/12/25 01:22

ご返信ありがとうございます。 > 端的に言えば、私の説明では、 上記を前提にご回答の内容を読み返したところ理解することができました。 また、これからは専門用語の質問をする際は、例えばコンストラクタの場合は、オブジェクト指向でのコンストラクタという概念の話なのか、JavaScriptでのconstructorプロパティに関した話なのかを区別するようにしたいと思います。
guest

0

プロトタイプチェーン

ここ最近のslimatが質問されている「prototype関連の質問」ですが、

半年前に質問されたプロトタイプチェーンを理解すれば、挙動は全て理解できます。

本質問の「コンストラクタが生成するオブジェクト」も同様です。

学習の方向性

プロトタイプをさまざまな角度で質問しているようですが、まずは、根本となるプロトタイプチェーンの動きを理解する事に注力することをお勧めします。
基本を理解してから、応用にのぞむべきです。

Re: slimat さん

投稿2019/12/04 11:40

編集2019/12/04 11:41
think49

総合スコア18162

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

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

slimat

2019/12/04 12:24

ご回答ありがとうございます. プロトタイプチェーンが根本となるのですね. しっかりと一読したいと思います.
think49

2019/12/04 23:43

@slimat さん > プロトタイプチェーンが根本となるのですね. しっかりと一読したいと思います. 一読ではなく、複読して下さい。 100%理解出来るまで何度でも読み直して、Web検索で様々なサイトの資料を解読し、様々な方面から思索を進めて、頭の中を整理してください。 確認のために何度でもテストコードを書いて、理解できるまで繰り返して下さい。 それでも理解できなければ、「自分が調べた内容」「自分の認識」を本文に含めて、質問して下さい。 いままでの質問を見ていると、回答された内容を十分に咀嚼せずに、次々と現れる疑問を口にしているように見受けられます。 https://teratail.com/questions/182067 の回答、掲示されたプロトタイプチェーンの資料を十分に理解してないから、今までの質問があるのではないでしょうか。 (今までの質問で、@slimat さんがプロトタイプを理解している事が本文から伝わってきません) ※そういう方へ何度も回答していると、回答しても理解して貰えない事が分かってくるので、無視するか、端的な回答に留める(時間をかける意味がない)ようになります。 https://teratail.com/questions/224306#reply-331229
slimat

2019/12/05 01:53

ご返信ありがとうございます. 承知致しました. テストコードを書いたことがプログラミング学習時に殆どなかったので, やります.
guest

0

オブジェクトのコンストラクタといえばfunctionでしょう
クラスのコンストラクタもあるので混同は禁物です

javascript

1function hoge(x){ 2 this.x=x; 3} 4const a=new hoge(123); 5console.log(a.x);

上記、オブジェクトaのコンストラクタはhoge

投稿2019/12/04 10:16

yambejp

総合スコア114833

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

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

dameo

2019/12/04 12:21

クラスのコンストラクタはオブジェクトのコンストラクタと同じモノだと思っていましたが、何が違うんでしょう? class hoge { constructor(x) { this.x = x; } } const a = new hoge(123); console.log(a.x);
yambejp

2019/12/04 12:23

クラスのコンストラクタは狭義の「constructor」があるのでhoge自体が コンストラクタと言うと混乱します。 実施hogeはfunctionのインスタンスのようなので実態は同じだと思います
dameo

2019/12/04 12:37

狭義とかよく分かりませんが、実態が同じなら混同してはいけないだと、かえって混乱してしまいそうです。 JavaScriptはこの辺を上手く説明するのが非常に難しいですよね。 回答するのであれば、概念的な質問は特にリンクで飛ばして省略したりせず、長文でもいいのでご自分の言葉で分かりやすく具体的な説明をした方がいいと思います。
yambejp

2019/12/05 00:42 編集

いつの間にdameoさんの質問にかわってますが(汗) 関数は「function自体」がコンストラクタで、 クラスは「クラスがfunction」で「クラスの中のconstrutor」がコンストラクタ なので明らかに違います 実態が同じなのは「関数のコンストラクタとクラス自体です」 安易にコンストラクタと言うとどちらを指すかわからないので 「混同は禁物」です 質問者さんから追加質問されてないので、理解いただいていると思いますが dameoさんは納得いかないのでしょうか?
dameo

2019/12/05 04:53

> いつの間にdameoさんの質問にかわってますが(汗) 私は質問しているというより、あなたの回答に疑義があると言っているだけです。 > dameoさんは納得いかないのでしょうか? はい、納得はいかないですね。明らかに違うとか混同は禁物とか言っている理由が説明されていません。 関数はnewを付けることでコンストラクタとしての機能を発揮する その機能はキーワードconstructorで宣言されるコンストラクタと同じで、生成物も同じですよね? あなたが言っているのはキーワードのfunctionとconstructorを同じと思ってはいけないってことではないですか? それらを同じと思う人はいないと思いますが、そういうことなら辻褄が合います。 そもそもの質問と関連がありませんけど…
yambejp

2019/12/05 05:12 編集

dameoさん たぶん理解できていないのはあなただけだと思いますが クラスのなかに「constructor」があるとしか説明のしようがありません これ以上は水掛け論にしかならないと思いますので 私の説明が理解できないならそもそもあなたへの回答ではないので無視してください コンストラクタ関数と、クラス内constructorメソッドは全然ちがうもの ・https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Creating_New_Objects/Using_a_Constructor_Functionhttps://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/constructor
dameo

2019/12/05 07:17

えーっと…まずその辺はMDN以外も含めて読んでいます。 リンク貼るだけで何かが証明されたりはしませんし、あなたが言ってることは私の反論に対する反論になっていません。 水掛け論を選択し、他人に理解していないと煽っているのはあなただけですよ。 結局あなたはfunctionとconstructorはキーワードとして違うとしか言っていません。 それは私の意見の反論になってないし、質問と無関係です。 これ以上は暖簾に腕押しですね。次からは正しい回答を望みます。
yambejp

2019/12/05 07:42

ご理解いただけ無いのは残念です 人の回答を正しくないように誹謗するのはどうかと思いますが 質問者さんに分かれば済む話なので これ以上はなにもお伝えすることはありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問