読者です 読者をやめる 読者になる 読者になる

new演算子による、インスタンスの作成

関数に対して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] }