クラスを定義するために使用している空の関数の役割を教えてください。

投稿者: Anonymous

いつもお世話になっています。
下記の質問についてご存知の方がいらっしゃいましたら、ご教示を願います


【質問の主旨】

下記のコードにおいて、var Person = function() {};はどのような役割を指定のでしょうか?

var Person = function() {};

Person.prototype = {
    eat: function() {
        console.log('もぐもぐと食べる');
    }
};

var  BusinessPerson = function() {
    Person.call(this);
};

BusinessPerson.prototype = new Person();

BusinessPerson.prototype.work = function() {
    console.log('せっせ、せっせと働く');
};

var bp = new BusinessPerson();
bp.eat(); // もぐもぐと食べる
bp.work(); // せっせ、せっせと働く

【質問の補足】

1.

var Person = function() {};はプロパティもメソッドも定義されていません。Personがクラスであることを示すためだけに、空の関数を定義しているだけであると解釈しても差し支えはないでしょうか?

2.

var Person = function() {};をコメントアウトすると、

Uncaught ReferenceError: Person is not defined es5_proto_chain.js:3

というエラーが表示されます。


以上、ご確認よろしくお願いします。

解決

下記のコードにおいて、var Person = function() {}; はどのような役割をしているのでしょうか?

コンストラクタです。若干の差異はありますが、以下と同等のものと考えて良いと思います。

function Person() {}

Person.prototype = {
    eat: function() {
        console.log('もぐもぐと食べる');
    }
};

function BusinessPerson() {
    Person.call(this);
}

BusinessPerson.prototype = new Person();

BusinessPerson.prototype.work = function() {
    console.log('せっせ、せっせと働く');
};

var bp = new BusinessPerson();
bp.eat(); //=> もぐもぐと食べる
bp.work(); //=> せっせ、せっせと働く

var Person = function() {}; はプロパティもメソッドも定義されていません。Personがクラスであることを示すためだけに、空の関数を定義しているだけであると解釈しても差し支えはないでしょうか?

確かに、Person 関数は new 演算子を用いてコンストラクタとして呼び出すことが可能です[1]。しかし、この関数は通常の関数呼び出しも可能であるため[1]この関数が定義された時点では用途が明らかになりません

そのため、当該関数定義のみを見た場合には「何の処理も行わない(normal な)関数 Person が定義された」と解釈するほうが適当ではないかと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *