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

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

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

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

Q&A

解決済

4回答

4139閲覧

JavaScriptの基本的な引数の使い方につきまして

SugiuraY

総合スコア317

JavaScript

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

1グッド

0クリップ

投稿2016/12/14 03:43

お世話になっております。

とても基本的な部分なのですが、明確に理解をしたいので、ご存知の方がいらっしゃればご教示をお願いします。

まず例えば

JavaScript

1var dat = new Date("2016/12/14"); 2document.write(dat.getFullYear()); 3//2016

これは換言すれば、組み込みオブジェクトのDateのインスタンスを生成して、その中のgetFullYearプロパティを使いたいのでドットで結んでいるということかと思います。

一方で

Javascript

1var num1=100, num2=200; 2document.write(Math.max(num1,num2)); 3//200

これは換言すれば、組み込みオブジェクトのMathオブジェクトを使用しており、ただMathオブジェクトは静的プロパティ/メソッドのため、インスタンスを生成できないので、そのmaxプロパティを直接使用していると理解しております。

<ご質問>

  1. ここで、一点目の質問ですが、dat.getFullYear()について、この()のなかに、"2016/12/14"としてdat.getFullYear("2016/12/14")としてMathオブジェクトのように引数を書かないのは、これはインスタンスを生成しているからなのでしょうか?

両者が数字をどのような流れで代入して、それぞれの返り値に至っているのかが引数の書き方の観点から分からなかったので、ご教示ください。

  1. また上記の1.の結果何らかの理由でインスタンスを生成する場合、特定のプロパティの呼び出しに引数を書かなくても良いとして(ここでいうdat.getFullYear()について、dat.getFullYear("2016/12/14")としなくても良いという意味)末尾の()については、なぜ省略できないのでしょうか?他のオブジェクトと比較した場合、

var str="Hello";
document.write(str.length);
のように引数の()が書略可能な場合と不可能な場合は本質的にどういう点で相違しているのか(document.write(str.length())としなくてよい。。?)がまだ理解できないのですが、この点ご教示願えますでしょうか?

何卒、宜しくお願い申し上げます。

Lhankor_Mhy👍を押しています

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

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

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

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

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

guest

回答4

0

おそらく理解されているのだと思うのですが感覚的なズレでしょうね
インスタンスを設定しなくてもカッコでくくればそこからメソッドは実行できます。

javascript

1console.log((new Date("2016/12/14")).getFullYear());

またstr.lengthはstringオブジェクトで定義されたオブジェクトstrに対して
lengthプロパティを参照してるだけなのでカッコがつきません
カッコがつくのはあくまでもメソッドを実行する場合です。
もしdateオブジェクトがfullyearというプロパティを持っていればカッコはつきません。

# 追記
文字列の長さをメソッドを利用して取ろうとおもえばprototypeを利用します。
ただしstringオブジェクトは自分自身を書き換えられないので
lengthの値を変更してのばしたり縮めたりすることはできません。

似たような(?)構造で、配列がありますが
こちらはlengthの値を変更できますので、setLength的な処理が可能です

javascript

1String.prototype.getLength=function(){return this.length;} 2var str='hello'; 3console.log(str.getLength()); 4 5Array.prototype.setLength=function(num){this.length=num;} 6var arr=['x','y','z']; 7arr.setLength(1); 8console.log(arr);

投稿2016/12/14 03:54

編集2016/12/14 05:27
yambejp

総合スコア114779

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

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

SugiuraY

2016/12/14 04:09

早速のご回答ありがとうございます。 概ね理解はできたのですが、整理をさせて頂くとメソッドなのかプロパティなのかということでしょうか。(たまに書籍でプロパティはメソッドを含む広義な概念として記載され手いる場合がありますが、ここでは明確に使い分けます。) つまり、Dateオブジェクトにはおそらく function getFullYear (d) {...}的なメソッドがり、このメソッドを呼び出しているので()をつける必要があるということでしょうか? 仮にインスタンスを作りDateオブジェクトを使用する場合には、その引数の中身の"2016/12/14"が何らかの形でインスタンスに引きつがれているということなのでしょうが? また、 >lengthプロパティを参照してるだけなのでカッコがつきません 。 とありますが、いまMDNで見たところ、.lengthプロパティは、文字列内のコード単位の数を返します。 私の認識ではプロパティとはその属性等を示す類(例えば{color:"red";})のものなので何らかの処理をするべきものではないという感覚でした。その文字列の長さを返すという行為は決まった属性を返すのではなく、変数に応じて処理をしてくれるため感覚的にはとてもメソッドに近いイメージなのですが、これは単なるプロパティに過ぎないということなのですね?
SugiuraY

2016/12/14 04:10

重ねてで恐れ入りますが、宜しくお願い申し上げます。
yambejp

2016/12/14 05:33

プロパティとして参照するかメソッドで呼び出すかは決まり事なので そういうものだと思うしかありません。 オブジェクトによってはプロパティに対して代入できたりできなかったり 言語の設計思想にかかわるものなのでなんともいいがたいです 一応サンプル追記しておきました
otn

2016/12/14 17:11

> インスタンスを設定しなくてもカッコでくくれば~ 初学者向けの回答としては、誤解を招きかねない表現かと思います(設定という語が曖昧)。 「インスタンスを一旦変数に代入しなくてもカッコでくくれば~」 のほうが良かったかと思います。
guest

0

ベストアンサー

Date.prototype.getFullYear() が引数を要求しない理由

  1. ここで、一点目の質問ですが、dat.getFullYear()について、この()のなかに、"2016/12/14"としてdat.getFullYear("2016/12/14")としてMathオブジェクトのように引数を書かないのは、これはインスタンスを生成しているからなのでしょうか?

Date.prototype.getFullYear()this 値を元に「年」を算出する為、引数を必要としません。

Date.prototype.getFullYear() の関数呼び出しで括弧を必要とする理由

  1. また上記の1.の結果何らかの理由でインスタンスを生成する場合、特定のプロパティの呼び出しに引数を書かなくても良いとして(ここでいうdat.getFullYear()について、dat.getFullYear("2016/12/14")としなくても良いという意味)末尾の()については、なぜ省略できないのでしょうか?

() を付けるのはそれが関数だからです。
原則として通常の関数呼び出し時には括弧が必須です(new 演算子で引数を指定しない場合のみ省略可能)。
括弧を付けずに new Date("2016/12/14").getFullYear で参照する為には new Date() 呼び出し時に「年」を算出して getFullYear プロパティを定義しなければなりません。
もしくは Date.prototype.getFullYear が getter プロパティとして定義されていなければなりません。

(2016/12/14 13:39追記)

ちなみに、関数に対して括弧を付けずに参照したら関数オブジェクト自身が返ります。

JavaScript

1var date = new Date("2016/12/14"); 2document.write(date.getFullYear); // function getFullYear() { [native code] } 3document.write(date.getFullYear()); // 2016

関数オブジェクトはコールバック関数として利用したり、別の場所へ参照コピーする際に利用できます。

プロパティとメソッド(関数)

メソッド(関数)は関数呼び出し時に処理を実行して返り値を算出します。
プロパティは基本的には処理を伴いませんが、getter/setter の例外があります。
Array#length には setter の役割があるため、処理を伴います。

JavaScript

1var a = new Array(1, 2, 3); 2a.length = 2; // Array#length は要素数が2になるように切り詰める処理を行う 3console.log(a); // [1, 2]

getter/setter は Object.create, Object.defineProperty でユーザ定義する事が出来ます。

Date.prototype.getFullYear の仮想コード

JavaScript

1function Date (year /* [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] */) { 2 this.timeValue = ...; // 1970/01/01 00:00:00 からのミリ秒を代入する。this.timeValue は内部プロパティ [[DateValue]] の仮想コードで実際には存在しない。内部プロパティ [[DateValue]] は外部から参照出来ない。 3} 4 5Date.prototype.valueOf = function valueOf () { 6 return this.timeValue; // 内部プロパティ [[DateValue]] を返す 7}; 8 9Date.prototype.getFullYear = function getFullYear () { 10 return this.timeValue / hogehoge ...; // 内部プロパティ [[DateValue]] を元に「年」を算出する 11};

更新履歴

  • 2016/12/15 08:45 「Date.prototype.getFullYear の仮想コード」を追記

Re: SugiuraY さん

投稿2016/12/14 04:24

編集2016/12/14 23:45
think49

総合スコア18162

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

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

SugiuraY

2016/12/14 15:30

ご回答ありがとうございます。 >Date.prototype.getFullYear() は this 値を元に「年」を算出する為、引数を必要としません。 これは、コンストラクタとして以下のように機能しているからというイメージでしょうか。本当に勉強したてで読んでいても手探りの部分があり抽象的ですみません。 function Date (y) { this.getFullYear=y...//yearをsliceするような処理イメージ(具体的にはわかりませんが、、) return this; } >() を付けるのはそれが関数だからです。 こちらは明確に理解ができました。ありがとうございます。 また、getter/setterで概念をお恥ずかしながら初めて知りました。本当に奥が深いです、、 改めて御礼申し上げます。
think49

2016/12/15 05:07

To: SugiuraY さん this.getFullYear は new Date 呼び出し時に初期化されるわけではありません。 もし、そうするなら関数ではなく、計算結果の「年」を代入しておけばいいので関数にする必要が無くなります。 あと、プロトタイプチェーンについて調べてみる事をお勧めします。 親記事に追記しました。
SugiuraY

2016/12/15 12:22

ご返信遅くなり申し訳ございません。また、コメント有難うございます。せっかくみなさんがご教示頂いた内容をわかった気になるのは嫌なので、咀嚼しながら、関連するマニュアルを読み学んでいるので、お返事も遅くなっております。確かにプロトタイプオプジェクト思考を明確に理解していく必要があると感じております。みなさんに提示して頂いたprototype.objectの流れやthisの使い方が直ぐには腹落ちしません。
guest

0

1

そうでもないです。

javascript

1var fakeDate = { 2 dat : '', 3 new :function(dat){ 4 this.dat = dat; 5 }, 6 getFullYear : function(){ 7 return this.dat.slice(0,4); 8 } 9} 10fakeDate.new('2016/12/14'); 11fakeDate.dat; // 2016/12/14 12fakeDate.getFullYear(); // 2016

ご覧のとおり、javascriptにはthisがありますので、インスタンスを作成していないオブジェクトでも引数を取らないメソッドを書くことができます。

2

もうお分かりかと思いますが、メソッドは呼び出しができる関数オブジェクトとして定義されていますので、引数がなくても関数呼び出しの書式を省略することはできません。
一方でプロパティは、文字列などの呼び出しができないオブジェクトとして定義されていますので、逆に呼び出しをするとエラーになります。

yambejpさんへのコメントを受けて追記

その文字列の長さを返すという行為は決まった属性を返すのではなく、変数に応じて処理をしてくれるため感覚的にはとてもメソッドに近いイメージ

javascript

1var fakeArray = { 2 length : 0, 3 arr : '', 4 new : function(x){ 5 this.arr = String(x); 6 this.length = 1; 7 }, 8 add : function(x){ 9 this.arr += ',' + String(x); 10 this.length += 1; 11 } 12} 13fakeArray.new(1); 14fakeArray.length; // 1 15fakeArray.add(2); 16fakeArray.length; // 2

こんな感じで、「プロパティを変化させるメソッドが存在する」と思えば、納得がいくのではないでしょうか。
ついでに言えば、文字列の場合、イミュータブルなオブジェクトだと思うので、lengthプロパティが変更されることはないでしょう。

投稿2016/12/14 04:09

編集2016/12/14 04:38
Lhankor_Mhy

総合スコア36074

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

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

0

有り体に言えば、Javascript では
変数に関数を格納できるということです。

int 型や array 型と同じように、
function 型というものがあると考えて下さい。

下記の二つは同義です。

Javascript

1// 記法 1 2function sampleFunction() { alert("SAMPLE"); } 3 4// 記法 2 5var sampleFunction = function() { alert("SAMPLE"); };

投稿2016/12/14 08:57

編集2016/12/14 09:18
MEBITUS

総合スコア83

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

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

SugiuraY

2016/12/14 15:15

ご回答をいただき、ありがとうございます。 正直申し上げて、私の理解がいたらず、引数の要否との関連ではわからなかったのですが、関数を変数に格納するという特異な部分は改めて、そうなのかと理解いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問