ここから本文です

JavaScriptでnew演算子やオブジェクト名を使う場合と使わない場合について JavaSc...

tka********さん

2018/7/1312:33:37

JavaScriptでnew演算子やオブジェクト名を使う場合と使わない場合について
JavaScriptの初心者です。

1.new演算子やオブジェクト名について
以下のようにnew演算子やオブジェクト名を使う場合と使わない場合があります。
これらを使う場合と使わない場合の理由や見分け方(どのような場合にこれらを使うのか、どのような場合にこれらを使わないのか)についてご教示ください。

(1)new演算子やオブジェクト名を使っている
var newDate = new Date();
newDate.getMonth()
https://msdn.microsoft.com/ja-jp/library/cd9w2te4(v=vs.94).aspx

(2)new演算子を使っていない
var start = Date.now();
https://msdn.microsoft.com/ja-jp/library/ff679974(v=vs.94).aspx

(3)new演算子やオブジェクト名を使っていない
parseInt("abc");
https://msdn.microsoft.com/ja-jp/library/x53yedee(v=vs.94).aspx

2.関数とメソッド
関数は手続き型プログラミングにおける処理で「関数名();」と表記し、メソッドはオブジェクト指向型プログラミングにおけるオブジェクトの振る舞い(関数)で「オブジェクト名.メソッド名();」と表記するという認識をしておりました。
ところが、例えばJavaScriptの組み込み関数の一つである「abs」は、関数という言い方をしているのに、「Math.abs」 として、「オブジェクト名.メソッド名()」のようにしてメソッド的な使い方をしています。JavaScriptにおける関数とメソッドの違いがよくわかりません。
どのように解釈したらよろしいでしょうか。

以上、よろしくお願いいたします。

閲覧数:
106
回答数:
4
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

sii********さん

2018/7/1314:27:57

> 1

--------------------
const a = new Date(2018, 6, 13)
const b = new Date(2018, 7, 13)

a.getMonth() // 6
b.getMonth() // 7
--------------------

抽象と具体という言葉がありますが、Date型という抽象的なデータ型を、newすることで具体化しています。

この具体化されたデータに対して何らかの処理を行う場合は、(2)のようなインスタンスメソッドを使い、それ以外の、そのデータ型に関係する一般的・汎用的な処理を行う場合は、(1)のようなクラスメソッドを使います。

この例のような「月を取り出す」という処理は、具体化されたデータに対する処理ですので、インスタンスメソッドを使っています。

一方、Date.nowは、先に具体化されたデータがあり、そのデータに対する処理を行うのではなく、「現在」を示す値を得るための、Date型の一般的な処理ととらえることができますので、クラスメソッドとして定義されているのではないかと思います。

ちなみに、Date.nowに近いメソッドとして、getTimeというインスタンスメソッドも用意されています。

--------------------
Date.now()
// 1970/01/01 00:00:00(UTC)から「現在」までの経過時間(ミリ秒)

a.getTime()
// 1970/01/01 00:00:00(UTC)からaオブジェクトが示す時間までの経過時間(ミリ秒)

b.getMonth()
// 1970/01/01 00:00:00(UTC)からbオブジェクトが示す時間までの経過時間(ミリ秒)
--------------------

------------

> 2

便宜上、関数とメソッドを区別せずに説明することがよく見られます。

Math.absについても、より正確なのはメソッドかと思いますが、単に説明として、関数と呼んでいるだけではないでしょうか。

私自身も、この区別はさほど重要とは思っていないので、文脈に応じて使う語を変えることがしばしばあります。

ちなみにですが、定義としてどうなっているかと言うと、

--------------------
4.3.31 method
function that is the value of a property

ECMAScript® 2018 Language Specification
https://www.ecma-international.org/ecma-262/9.0/index.html#sec-meth...
--------------------

プロパティ値である関数をメソッドと呼ぶことになっています。

つまり、「関数のうち、オブジェクトのプロパティであるものをメソッドと呼ぶ」という関係ですので、メソッドを関数と呼んでも誤りということではありません。

少し話は変わりますが、全てのグローバル変数は、グローバルオブジェクトのプロパティとなります。WebページのJavaScriptであればwindowです。

ということは、グローバル空間で宣言した関数は全て、グローバルオブジェクトのメソッドとして呼び出すことができるわけです。

function hoge () { console.log('hoge') }
window.hoge() // hoge

hogeは関数でしょうか、それともメソッドでしょうか?どちらも間違いではないように思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

dol********さん

2018/7/1410:34:21

具体的な言語仕様として、

> (1)new演算子やオブジェクト名を使っている

new はプロトタイプチェーンをつなぐ。つまり、そのオブジェクトの固有プロパティではなくても、プロトタイプのプロパティにアクセスできるようになる。

そうすることで、複数のオブジェクトに共通するプロパティと、各オブジェクトに固有のプロパティとを別々に管理できるようになる。

なお、JavaScript では、メソッドとは「値が関数であるプロパティ」にすぎない。すべてをプロパティの集合として扱うのが JavaScript。

> (2)new演算子を使っていない
> (3)new演算子やオブジェクト名を使っていない

上記は同じ。parseInt() は「グローバルオブジェクト」のプロパティ。Web ブラウザ上なら、グローバルオブジェクトは window に紐付けられているので、window.parseInt() とも書ける。

Date.now() や window.parseInt() はそれぞれ Date オブジェクト、window(グローバル)オブジェクトの固有プロパティ。

Date は Object.prototype にプロトタイプチェーンがつながっている(オブジェクト指向風に言えば、Object のインスタンスになっている)ので、Object のメソッド類も使える。それに加えて、now() という固有プロパティを持っているということ。

> 「Math.abs」

Math は Date と違ってコンストラクタではないので、new できない(インスタンスを持たない)。

数学関連のプロパティの集合体(オブジェクト)。

nee********さん

2018/7/1316:46:02

私はJavaScriptは専門外なので無難ところのみアドバイスします。

>JavaScriptにおける関数とメソッドの違いがよくわかりません。

関数とメソッドは本質的に同じモノと理解してください。
変数におけるstatic宣言の有無の相違で良いです。
私はC/C++が専門なのでC++風に説明します。

// a.cpp
int _g_hoge;
static int _g_hoge;

この違いに近いですね。static宣言をするとa.cppの中でのみ参照できます。
メソッドはクラス定義した中でのみ使える関数。
普通の関数はどのファイルでも使用可能です。

チームワークでプログラムを組んでいると、複数の人が重複した命名をする場合が出てきます。従来の関数はこういう問題が出てきます。メソッドの場合は頭に所属するクラス情報があるから重複問題が出てきません。

関数もメソッドも同じサブルーチンなんですが、メソッドは名称のバッティング問題がクラスで分類しているので回避されています。
どちらも同じサブルーチンですがバッティング問題に工夫されているくらいに思った方が良いです。

誰もが使う標準サブルーチンは関数型が便利で、ローカル色が強いとメソッドの方が便利です。
オブジェクト指向の名称に従来と断裂が起きているのは命名者が気負って新しい概念としたかったくらいで良いかと思います。

メソッドをクラス別けした関数と称しても問題ないでしょう。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

tou********さん

2018/7/1315:28:19

# 1.
JavaScriptでは関数もオブジェクトであること、
JavaScriptにおける「プロトタイプ」とは何か、
これを理解する必要があります。

簡単なサンプルを作りました。
https://jsfiddle.net/sutara79/0g1zykam/
ページ左上の「▷Run」で実行できます。
実行しつつソース内のコメント読めば、ざっくりと理解してもらえると思います。

上のサンプルでは「Foo」という関数を作りましたが、組み込みの「Date」でも同じことです。
なお、JavaScriptの仕様を調べるにはMDNのページが詳しくていいと思います。
参照: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Glob...
上のページの左側の「関連トピック」を見てください。
Date.now() は関数Dateのメソッド、
Date.prototype.getMonth() は関数Dateのプロトタイプのメソッドです。
これで、new演算子の要・不要の違いが分かると思います。
プロトタイプについて詳しく知りたければ、「JavaScript プロトタイプ とは」で検索してください。

そして、parseInt() はグローバルな組み込み関数です。
参照: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Glob...
上のサンプルのFoo() と同じく、関数を呼び出す時にはnew演算子やオブジェクト名は不要です。


# 2.
私も、siiさんと同意見です。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる