【WSH事始め】継承を整理/Object.create() 同等の関数と コンストラクタ連鎖のcall(),appry()

はじめに

 わかっている人はわかってる事柄。コレとコレどう違うの? 存在意義あるの?って思っちゃうだろうなぁって事へ ちょっとした解説を加えます。

★Object.create() 同等の関数で プロトタイプオブジェクトを継承する

 ES3で継承を行う説明でよく出てくるのが、new 演算子や、call()、appry() のメソッドを使ったやり方ですが、コンストラクタで関数初期化しているところにプロトタイプオブジェクト臭さが無いので個人的にはこれらは使っていません。

 プロトタイプオブジェクトの継承をするならES5 で追加されたObject.create() メソッドを使いたいところですが、MDNを見ていたら Object.create() 同等のポリフィルと関数が紹介されていました。

(「オブジェクト指向 JavaScript 入門」の継承より引用)

function createObject(proto) {
   function ctor() { }
   ctor.prototype = proto;
   return new ctor();
}
// 使用法:
Student.prototype = createObject(Person.prototype);
 今後作成していく記事の中で 継承目的で プロトタイプオブジェクトを作成する場合はこのコードを使っていきます。


 分けると内容が被りそうなのでMDNの関数と一緒にしたせいで、内容が蛇足にみえるけど、こっちが本題。

1. new演算子の場合

 元々はインスタンス生成をするものなので、プロトタイプオブジェクトだけ有れば良いものを実体も作ってしまうのでメモリ効率が悪いらしいです。


2. call() の場合

 構文は以下の通り。

『func.call(args_this,this_arg1,this_arg2,...);』

敢えて説明すると動作はこんな感じ
 1. this_arg1,2 でargs_thisで指定した関数を呼び出す。
 2. コンストラクタ(func)へthis_arg1,2を渡しプロパティを初期化する。

 プロトタイプを定義するメソッドとして紹介されるけど、やってることは「コンストラクタの連鎖」だそうです。

 つまりプロトタイプと決めた関数を呼び出して初期化する事で継承を実現している、という事なんでしょう。


3. apply() の場合

構文です。

『func.appry(args_this,args_Array);』

 実行するとcall() メソッドとほぼ同じ結果になります。指定したオブジェクトを呼び出して、渡した配列(要素が引数に該当する)で関数を実行した結果がプロパティとなります。


4. Object.create() メソッドの場合

 「Object.create() メソッドは、既存のオブジェクトを新しく生成されるオブジェクトのプロトタイプとして使用して、新しいオブジェクトを生成します。」素直にこれを使いたいですね。でもES5で追加されたメソッドなのでJScript では使えません。


この記事が気に入ったらサポートをしてみませんか?