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

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

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

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

jQuery

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

Q&A

2回答

1781閲覧

関数がオブジェクトとは

foo45

総合スコア106

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

jQuery

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

3グッド

2クリップ

投稿2015/09/13 06:46

編集2015/09/13 07:09

JavaScriptの関数はオブジェクトであると参考書でみました。

javascript

1//JavaScript Document 23function obj() { 4 var hoge = 1; 5 return this.a; 6} 7 8window.a = 1; 9document.write(obj(a)); 10=========================== 1112var obj_1 = function() { 13 var hoge = 1; 14 return this.a; 15} 16window.a = 1; 17document.write(obj_1(a)); 18=========================== 1920function obj_2() { 21 this.a = 1; 22} 23 24var ins = new obj_2(); 25document.write(ins.a);

これらはfunctionオブジェクトと呼ばれているらしいのですが、たとえば②の例のthisはwindowオブジェクトを指していて、③の場合はobj_2()の関数オブジェクトからインスタンスを生成してinsに代入しているため、このときのthisはinsを指している。というのを理解しました。

そして関数オブジェクトのプロパティに関数を定義して、その関数の中のthisは何なのかを調べたのですが、

javascript

1// JavaScript Document 2function obj_2() { 3 this.a = a; 4} 5 6obj_2.c = function() { 7 return this; 8} 9 10document.write(obj_2.c()); // function obj_2() { this.a = a; }

こうなって、thisはfunctionオブジェクトを指していました。
なぜですか?

また、オブジェクトについてとても曖昧な点があるので教えていただきたいです。
オブジェクトを作る場合は、

JavaScript

1//JavaScript Document 2var obj = {name: 'hoge'}; // なじんだ書き方 3var obj = new Object({name: 'hoge'}); // 明示的な書き方

とあると知ったので、このObjectとは何かと思い

JavaScript

1document.write(Object);

とObjectが何なのか確認すると

javascript

1 function Object() { [native code] }

このように出力され、Objectとは関数オブジェクトなのか?と頭が混乱しています。
このObjectがオブジェクトの最上位?みたいな感じで、Objectの中にprototypeプロパティがあったりするのですよね?
このObjectをnew演算子を使い、初期化したのを変数に入れると暗示的なこのオブジェクト生成の書き方になるのでしょうか?

JavaScript

1//JavaScript Document 2var obj = {name: 'hoge'};

だとしたら別の変数で初期化したObjectを保持しているわけだから変数に代入したオブジェクトごとにprototypeプロパティのオブジェクトの中身も別々になるということになってこうなってると思うんですが、どうなのでしょうか?

javascript

1//JavaScript Document 2var Object = { 3 prototype: 'prototypeオブジェクト' 4} 5 6var name = new Object({tree: 'matsu'}); 7var food = new Object({okashi: 'ame'}); 8var hensu = 6; 9 10//オブジェクトを生成すると、自動でObjectオブジェクトの中に入る? 11 12Object = { 13 prototype: {prototypeオブジェクト....}, 14 15 window: { 16 name: {'tree: 'matsu'}, 17 food: {'okashi: 'ame'}, 18 hensu: 6, 19 } 20}

変なこと言ってると思いますが、どうぞよろしくお願いします

rossi46hiro, afroscript👍を押しています

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

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

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

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

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

guest

回答2

0

JavaScriptのthisは、シチュエーションによって4通りの値を取ります。

・ オブジェクトに紐付かない関数呼び出し(上の①や②)の場合、thisはグローバルオブジェクト(strictでない場合)またはnull(strictの場合)です。
new付きで呼び出した場合(上の③)、thisは新しく生成するオブジェクトを指します。
・ オブジェクトのメソッドとして呼び出した場合(質問の例)、thisはメソッドの属するオブジェクトを指します。
・ 関数オブジェクトのapplycallメソッド(関数自体もオブジェクトということで、それにもメソッドがあります)を使って、意図的にthisを切り替えることもできます。

後半の質問ですが、JavaScriptでnewのあとに書くものは、常に関数です。{}で生成したオブジェクトも、new Objectで生成したものと同じオブジェクトです(どちらも同じプロトタイプを参照します)。

投稿2015/09/13 07:18

maisumakun

総合スコア145121

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

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

foo45

2015/09/13 07:34

簡潔でわかりやすかったです
guest

0

一つ目について。

javascript

1// JavaScript Document 2function obj_2() { 3 this.a = a; 4} 5 6obj_2.c = function() { 7 return this;//まずこのthisはobj_2(関数オブジェクト)を指します。 8} 9 10document.write(obj_2.c()); // function obj_2() { this.a = a; } 11//obj_2.c()を実行するとthisが帰ってきます。その中のthisはobj_2を指すため上のような動作になります。 12//ちなみに帰ってきた関数も関数オブジェクトの為(obj_2.c())();なんてことも出来るはずです。(試してないけど

2つめについては確信では無いのでもしかしたら間違っているかもしれません。
function Object() { [native code] } はjavascriptエンジンのコンストラクタでありjsの概念にとらわれません。多分返り値はjavascriptのオブジェクトを表現してるjavascriptエンジン(c++等)のオブジェクトでありこのfunctionは関係ありません。

すいません。なんか僕もぐちゃぐちゃになってきました。

投稿2016/02/12 08:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問