関数に対してnew
演算子を使うことで、オブジェクトを新しく作ることが出来る。
この関数をコンストラクタ、生成されるオブジェクトをインスタンスと呼ぶ。
コンストラクタにおけるthis
は、new
演算子によって生成されるインスタンスを指す。
function Person(name){ this.name = name; this.returnThis = function(){ return this; }; }; var person1 = new Person('Tom'); console.log(person1.name); // Tom console.log(person1.returnThis()); // Person { name: 'Tom', returnThis: [Function] }
new
演算子を使う場合はコンストラクタのなかにreturn
を書く必要はないが、書くことも出来る。
戻り値がオブジェクトであれば、そのままそのオブジェクトが返される。戻り値がプリミティブ型だった場合は、return
は無視され、通常通り、new
演算子で生成したインスタンスが使用される。
function Person(name, age){ this.name = name; this.age = age; return {name: 'Mr.'+name}; }; var person1 = new Person('Tom'); console.log(person1.name); // Mr.Tom console.log(person1.age); // undefined
コンストラクタでは、Object.defineProperty()
やObject.defineProperties()
を使ってプロパティを定義することも出来る。
これらのメソッドについては、下記を参照。
プロパティの内部属性
function Person(name){ Object.defineProperties(this, { 'name': { value: name, writable: true, enumerable: true, configurable: true }, 'age': { value: 30, writable: true, enumerable: true, configurable: true } }); this.sayName = function(){ console.log(this.name); }; }; var person1 = new Person('Tom'); person1.sayName(); // Tom person1.name = 'Bob'; person1.sayName(); // Bob console.log(person1); // Person { name: 'Bob', age: 30, sayName: [Function] }