JavaScript文法(8) JavaScriptのオブジェクト指向プログラミング1 概要

# この記事の内容

* オブジェクト指向プログラミング言語としてのJavaScriptの概要
* 組み込みオブジェクトについて

# 目次

(1) [学習環境の構築と基本的な書き方](http://qiita.com/azk0305/items/a13d494178d83fc8f2bc)
(2) [変数とデータ型](http://qiita.com/azk0305/items/d78d744dff9656b22dd0)
(3) [演算子および配列](http://qiita.com/azk0305/items/748f4afadcfa5350a552)
(4) [制御構文と関数](http://qiita.com/azk0305/items/ed943040a8f7140d5a48)
(5) [関数の応用1](http://qiita.com/azk0305/items/f7e0653b20425fdb9f1b)
(6) [関数の応用2](http://qiita.com/azk0305/items/0fd54f9c66f726443dd6)
(7) [オブジェクトの基礎](http://qiita.com/azk0305/items/0d2018a1c6e547b7f65a)
(8) JavaScriptのオブジェクト指向プログラミング1 概要 **<-- この記事の内容**
(9) [JavaScriptのオブジェクト指向プログラミング2 オブジェクトの作り方と継承](http://qiita.com/azk0305/items/386b3a2ac41caf3101e1)
(10) [JavaScriptのオブジェクト指向プログラミング3 多態性](http://qiita.com/azk0305/items/1c713562f6f842dcf1dc)
(11) [JavaScriptのオブジェクト指向プログラミング4 カプセル化](http://qiita.com/azk0305/items/914f6e447b41d4ced25e)
(12) [ES6の新機能について](http://qiita.com/azk0305/items/ebfb43c088101f7138f9)

# オブジェクト指向におけるJavaとJavaScriptの決定的な違い

さて今回から、JavaScriptにおけるオブジェクト指向プログラミングについて、詳細を観ていく。まず最初に、オブジェクト指向プログラミングという観点において、Javaとの決定的な違いとして、**JavaScriptはクラスベースではない**、ということである。

通常、Javaであれば、

```java
class Sample {
    int a = 1;
    int b = 2;

    public void plus(int x){
        System.out.println(a + x);
    }
}

public class UseSample {
    public static void main(String[] args){
        Sample sample = new Sample();

        sample.plus(2);
    }
}
```

上記のように、「クラス」を作成し、new演算子で「インスタンス」を生成し、プロパティにアクセスしたりメソッドを実行したりする。

しかし、 *ES5時点での* JavaScriptでは「class ○○」と書くことができない。なのにnew演算子はJavaScriptにもあって、

```js
var str = new String("abc");
```

このように記述すれば `String` 型のオブジェクトを生成することができる。これはどういうことかというと、Javaのnew演算子は、（よく使われる例えを引用すると）「クラス」という金型から「インスタンス」というクッキーを1枚ずつ作る、のに対し、JavaScriptのnew演算子は、**既に作成されているオブジェクトを受け継いだ新しいオブジェクトを作る**、という仕様なのである。

文字列型の `String` は、`String`という名前のオブジェクトが存在しているから、このような動作になる。

# 組み込みオブジェクト

ここで、`String` をはじめとした、JavaScriptで最初から標準で用意されている各種オブジェクトについて、まとめておく。

どういうものがあるかについては、下記のリファレンスを参照。

標準ビルトインオブジェクト - JavaScript | MDN
[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects)

代表的なものについてのみ、触れておく。

| オブジェクト名 | 説明 |
|:---|:---|
| [Object](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object) | すべてのオブジェクトの元になっているオブジェクト |
| [Date](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date) | 日時の情報が入っているオブジェクト。日時に関する操作ができるメソッドを持つ。 |
| [Math](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math) | 計算に関するメソッドを持つオブジェクト。 |
| [Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array) | データを配列の形で格納するためのオブジェクト。配列操作のメソッドを持つ。 |
| [String](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String) | 文字列を格納するオブジェクト。文字列操作ができるメソッドを持つ。 |

基本的には、 `new` 演算子を使って組み込みオブジェクトを受け継いだ新しいオブジェクトを作る。

```js
var dtm = new Date();
```

`オブジェクト名.メソッド名()` のように記述して、作った新しいオブジェクトが持つメソッドを実行する。（いわばインスタンスメソッド）

```js
// 今年は2016年です と表示される（執筆時）
console.log("今年は" + dtm.getFullYear() + "年です");
```

ただ、`Math`オブジェクトなど、わざわざ新しいオブジェクトを作る必要がないオブジェクトもあり、そういったオブジェクトのメソッドを実行したい場合は、

```js
var f = 1.5;              // 実数
var i = Math.round(f);    // roundで小数点以下を四捨五入
console.log(i);           // 2 と表示される
```

このように `組み込みオブジェクト名.メソッド名()` で良い。（いわばクラスメソッド）

## Objectオブジェクト

Javaでは、一番上のクラスに `java.lang.Object` があって、他のクラスは必ずコレを継承しているのと同様、JavaScriptでは、すべてのオブジェクトが `Object` オブジェクトを継承している。

## Dateオブジェクト

| メソッド名 | 説明 |
|:---|:---|
| getFullYear | 「年」の数（西暦）の4桁を返す |
| getMonth | 「月」の数を返す。ただしreturn値は 0 から 11 までとなっていて、実際の月数から-1ずれている。 |
| getDate | 「日」の数を返す |
| getHours | 「時」の数を返す |
| getMinutes | 「分」の数を返す |
| getSeconds | 「秒」の数を返す |

## Mathオブジェクト

| メソッド名 | 説明 |
|:---|:---|
| ceil | 小数点以下を切り上げにした数値を返す |
| floor | 小数点以下を切り捨てにした数値を返す |
| round | 小数点以下を四捨五入した数値を返す |
| abs | 絶対値の計算結果を返す |
| pow | 累乗（xのy乗）の計算結果を返す |
| sqrt | 平方根の計算結果を返す |
| random | 0以上1未満のランダムな数値を返す |

## Arrayオブジェクト

| メソッド名 | 説明 |
|:---|:---|
| push | 配列の末尾に新しい要素を追加する |
| pop | 配列の末尾にある要素を削除する |
| join | 引数に指定した文字を区切り文字として、配列要素を1つの文字列にまとめる |
| reverse | 配列を逆順にする |
| sort | 配列要素のABC順で配列を並び替える |
| indexOf | 引数に指定した配列要素が配列の何番目にあるか検索する |

また、`Array` オブジェクトには、`length` プロパティという、配列の要素が何個あるかという情報を保持するプロパティを持っている。

## Stringオブジェクト

| メソッド名 | 説明 |
|:---|:---|
| indexOf | 引数に指定した文字列を検索する |
| slice | 文字列の一部分を抜き出す |
| split | 引数に指定した文字を区切り文字として、文字列を区切って配列にする |
| reverse | 配列を逆順にする |
| match | 引数に指定した正規表現を基にして文字列を検索する |
| replace | 正規表現を基にして文字列を検索し、該当する箇所を別の文字列で置き換える |
| trim | 文字列の最初と最後にある不要なスペース（空白）を削除する |

※正規表現については割愛。このサイトなどを参照。

サルにもわかる正規表現入門
[http://www.mnet.ne.jp/~nakama/](http://www.mnet.ne.jp/~nakama/)

そのまま使える正規表現集
[http://befine.jugem.jp/?eid=29](http://befine.jugem.jp/?eid=29)

# 次回予告

独自なオブジェクトの作り方と継承について