サイトトップ

Director Flash 書籍 業務内容 プロフィール

HTML5テクニカルノート

Function.prototypeプロパティ

ID: FN1212005 Technique: HTML5 and JavaScript

Function.prototypeプロパティ
文法 Functionオブジェクト.prototype
プロパティ値 コンストラクタとして呼出した関数に備わるプロトタイプオブジェクトを参照する。コンストラクタからつくられたオブジェクトは、そのプロトタイプオブジェクトがもつすべてのプロパティとメソッドを継承する。

説明

コンストラクタとして呼出された関数は、プロトタイプオブジェクトをひとつもちます。そして、コンストラクタからつくられたインスタンスは、そのプロトタイプオブジェクトを参照し、プロトタイプオブジェクトに加えられたプロパティやメソッドを自らに定められたものと同じように使えます。


つぎに定めるクラス(Vector2D)は、Function.prototypeプロパティを用いず、コンストラクタ関数(Vector2D())の中でthisキーワードにより参照したインスタンスに直にメソッド(getLength())を加えています。コンストラクタ関数には引数として(x, y)座標を与え、メソッドは原点(0, 0)からその座標までの距離を返します。

function Vector2D(nX, nY) {
  this.x = nX;
  this.y = nY;
  this.getLength = function () {
    var nLength = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2));
    return nLength;
  }
}

前掲のクラス(Vector2D)からつぎのJavaScriptコードのように座標(1, √3)のインスタンスをつくって、メソッド(getLength())を呼出すと、警告ダイアログボックスに原点から座標までの距離が示されます(図001)。メソッドはインスタンスごとに加えられるので、複数のインスタンスをつくればその数だけメソッドに定める関数もつくられることになります。

var vector = new Vector2D(1, Math.sqrt(3));
alert(vector.getLength());

図001■警告ダイアログボックスに原点から座標までの距離が示される

つぎのクラス(Vector2D)は、コンストラクタ関数(Vector2D())のFunction.prototypeプロパティを参照して、プロトタイプオブジェクトにメソッド(getLength())を定めました。すると、このコンストラクタからつくられるインスタンスはすべて同じプロトタイプオブジェクトを参照して、そこに定められたメソッドが呼出されます。

前のクラスの定義とメソッドそのものの動きは変わりません。けれど、インスタンスがいくつつくられても、メソッドとして呼出されるのはプロトタイプオブジェクトに定められたひとつの関数になります。

function Vector2D(nX, nY) {
  this.x = nX;
  this.y = nY;
}
Vector2D.prototype.getLength = function () {
  var nLength = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2));
  return nLength;
}

プロトタイプオブジェクトにはプロパティも加えられます。すると、インスタンス自身にまだそのプロパティがないときに、プロトタイプオブジェクトから値が参照されます。つぎのクラス(Vector2D)は、コンストラクタ関数(Vector2D())のFunction.prototypeプロパティに、ふたつのプロパティ(xとy)とその値を定めました。

function Vector2D(nX, nY) {
  this.x = nX;
  this.y = nY;
}
Vector2D.prototype.x = 0;
Vector2D.prototype.y = 0;

つぎのJavaScriptコードは、初めに引数でプロパティ値(10, 20)を与えてインスタンスをつくってから、インスタンスのひとつのプロパティ(x)をdelete演算子で削除しています。すると、インスタンスから除かれたプロパティ(x)の値は、プロトタイプオブジェクトから参照されます(図002)。

var vector = new Vector2D(10, 20);
delete vector.x;
alert([vector.x, vector.y]);

図002■警告ダイアログボックス示されたふたつのプロパティ値


参考

MDN「Function.prototype


作成者: 野中文雄
作成日: 2012年12月24日


Copyright © 2001-2012 Fumio Nonaka.  All rights reserved.