回答編集履歴

1 具体例を追加

unau

unau score 2451

2017/09/05 08:53  投稿

`person` はオブジェクトであり、その型は「関数オブジェクト」です。
`me` はオブジェクトであり、型は無名ですが、`person` で示される型です。
変数 (や定数) には、オブジェクトとプリミティブがあります。プリミティブはそれ以上の構造を持たない数 (`12` とか `1.5` とか) や文字列 ("test" とか) などがあります。それ以外はオブジェクトと考えてさしつかえないと思います。
`new person()` でオブジェクトを生成するメリットは、`person` 型の prototype にメソッド (たとえば、`walk()`) を追加すると、そのメソッドの実体が一つでも、生成したオブジェクト、たとえば `me` から `me.walk()` のように `me` 自体のメソッドのように呼べること、などです。
`new person()` でオブジェクトを生成するメリットは、`person` 型の prototype にメソッド (たとえば、`walk()`) を追加すると、そのメソッドの実体が一つでも、生成したオブジェクト、たとえば `me` から `me.walk()` のように `me` 自体のメソッドのように呼べること、などです。
---
コメントを受けて追記
- `person` は `function` という型のインスタンスです。
- `me` は `person` という型のインスタンスです。
もうちょっと詳しく書くと、
- `person` は `function` という型のインスタンスです。関数オブジェクトとも言います。関数オブジェクトは型となれます。
- `me` は `person` という変数に格納された関数オブジェクトを型としたときのインスタンスです。
という感じです。
例を示しながら。
```js
var person = function() {
  this.name = "no name";
}
var me = new person();
var he = new person();
var it = new person();
person.prototype.setName = function(name) {
 this.name = name;
 return this;
};
person.prototype.isHuman = true;
person.prototype.greet = function() {
 console.log("my name is " + this.name + " (" + (this.isHuman ? "human" : "?")\
+ ").");
};
me.bark = function() {
 console.log(this.name + "!!!");
};
it.isHuman = false;
me.setName("Taro").greet(); //-> my name is Taro (human).                     
he.setName("Jiro").greet(); //-> my name is Jiro (human).                     
it.greet();                //-> my name is no name (?).                       
me.bark();                 //-> Taro!!!                                       
he.bark();                 //-> エラー発生 (he.bark is not a function)       
```
`person` 型のオブジェクト `me`, `he`, `it` を生成しました。`me` にはオブジェクト固有のメソッド `bark()` が定義してあります。`it` には固有のプロパティ `isHuman` が定義してあります。これらは、オブジェクトごとに記憶領域を持っているわけです。
一方で、`setName()` メソッドや `greet()` メソッド、そして `isHuman` プロパティについては、`person` という型のほうに定義してあります。これらは `person` 型の記憶領域に保存されているので、`person` 型のインスタンスをいくら生成しても、これらの分の記憶領域は消費されません。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る