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

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

ただいまの
回答率

90.48%

  • JavaScript

    20937questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,194

SugiuraY

score 208

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

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

まず例えば

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


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

一方で

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

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

<ご質問>

  1. ここで、一点目の質問ですが、dat.getFullYear()について、この()のなかに、"2016/12/14"としてdat.getFullYear("2016/12/14")としてMathオブジェクトのように引数を書かないのは、これはインスタンスを生成しているからなのでしょうか?
    両者が数字をどのような流れで代入して、それぞれの返り値に至っているのかが引数の書き方の観点から分からなかったので、ご教示ください。

  2.  また上記の1.の結果何らかの理由でインスタンスを生成する場合、特定のプロパティの呼び出しに引数を書かなくても良いとして(ここでいうdat.getFullYear()について、dat.getFullYear("2016/12/14")としなくても良いという意味)末尾の()については、なぜ省略できないのでしょうか?他のオブジェクトと比較した場合、
    var str="Hello";
    document.write(str.length);
    のように引数の()が書略可能な場合と不可能な場合は本質的にどういう点で相違しているのか(document.write(str.length())としなくてよい。。?)がまだ理解できないのですが、この点ご教示願えますでしょうか?

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+6

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

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

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

 追記

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

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

String.prototype.getLength=function(){return this.length;}
var str='hello';
console.log(str.getLength());

Array.prototype.setLength=function(num){this.length=num;}
var arr=['x','y','z'];
arr.setLength(1);
console.log(arr);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/14 13:09

    早速のご回答ありがとうございます。
    概ね理解はできたのですが、整理をさせて頂くとメソッドなのかプロパティなのかということでしょうか。(たまに書籍でプロパティはメソッドを含む広義な概念として記載され手いる場合がありますが、ここでは明確に使い分けます。)

    つまり、Dateオブジェクトにはおそらく function getFullYear (d) {...}的なメソッドがり、このメソッドを呼び出しているので()をつける必要があるということでしょうか?
    仮にインスタンスを作りDateオブジェクトを使用する場合には、その引数の中身の"2016/12/14"が何らかの形でインスタンスに引きつがれているということなのでしょうが?

    また、
    >lengthプロパティを参照してるだけなのでカッコがつきません 。
    とありますが、いまMDNで見たところ、.lengthプロパティは、文字列内のコード単位の数を返します。
    私の認識ではプロパティとはその属性等を示す類(例えば{color:"red";})のものなので何らかの処理をするべきものではないという感覚でした。その文字列の長さを返すという行為は決まった属性を返すのではなく、変数に応じて処理をしてくれるため感覚的にはとてもメソッドに近いイメージなのですが、これは単なるプロパティに過ぎないということなのですね?

    キャンセル

  • 2016/12/14 13:10

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

    キャンセル

  • 2016/12/14 14:33

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

    キャンセル

  • 2016/12/15 02:11

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

    キャンセル

checkベストアンサー

+5

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

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

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

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

2. また上記の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追記)

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

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

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

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

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

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

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

 Date.prototype.getFullYear の仮想コード

function Date (year /*  [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] */) { 
  this.timeValue = ...; // 1970/01/01 00:00:00 からのミリ秒を代入する。this.timeValue は内部プロパティ   [[DateValue]] の仮想コードで実際には存在しない。内部プロパティ [[DateValue]] は外部から参照出来ない。
}

Date.prototype.valueOf = function valueOf () {
  return this.timeValue;  // 内部プロパティ [[DateValue]] を返す
};

Date.prototype.getFullYear = function getFullYear () {
  return this.timeValue / hogehoge ...; // 内部プロパティ [[DateValue]] を元に「年」を算出する
};

 更新履歴

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

Re: SugiuraY さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/15 00:30

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

    また、getter/setterで概念をお恥ずかしながら初めて知りました。本当に奥が深いです、、
    改めて御礼申し上げます。

    キャンセル

  • 2016/12/15 14:07

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

    キャンセル

  • 2016/12/15 21:22

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

    キャンセル

+3

 1

そうでもないです。

var fakeDate = {
  dat : '',
  new :function(dat){
    this.dat = dat;
  },
  getFullYear : function(){
    return this.dat.slice(0,4);
  }
}
fakeDate.new('2016/12/14');
fakeDate.dat; // 2016/12/14
fakeDate.getFullYear(); // 2016


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

 2

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

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

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

var fakeArray = {
  length : 0,
  arr : '',
  new : function(x){
    this.arr = String(x);
    this.length = 1;
  },
  add : function(x){
    this.arr += ',' + String(x);
    this.length += 1;  
  }
}
fakeArray.new(1);
fakeArray.length; // 1
fakeArray.add(2);
fakeArray.length; // 2


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

下記の二つは同義です。

// 記法 1
function sampleFunction() { alert("SAMPLE"); }

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/15 00:15

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    20937questions

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