フロントサイドエンジニアという選択肢

HTMLコーダー → ECサイト運営 → システムエンジニア という経歴の著者がフロントサイトエンジニアという職業に今後の活路を見出し、その道に進むために取得した技術を貯めておくブログ

(Javascript)他の関数のメソッドをコピーする

関数やコンストラクタを定義する時に、他の関数からメソッドをコピーすることが出来ます。
但し、コピー元のメソッドは関数定義後に追加する形で記述しなければなりません。おそらく、関数内部に記述してしまうと、関数が呼び出されるまで実態がない状態になるのだと思われます。

// 関数(コンストラクタ)AとBを用意する。
function A(){}
function B(){}

// Aのprototypeにメソッドを追加する。
A.prototype.methodA = function()
{
    document.write('method A<br />');
}

// BのprototypeにAのメソッドをコピー
B.prototype.methodB = A.prototype.methodA;

// Bをインスタンス化してメソッドを呼び出す。
var b = new B();
b.methodB(); // method A

上記のサンプルはprototypeにメソッドをセットしていますが、上記のような場合は双方の関数のメソッドはprototypeに記述しないとうまくいかないようです。これも関数が呼び出されるまでメソッドが実態にならないことが原因だと考えられます。
なので、メソッドを関数内部にprototypeを使わずに記述する場合は、一度関数をインスタンス化して、そのインスタンスからコピーするとうまく行きます。

// prototypeを使わず、関数内部にメソッドを記述する場合
function C()
{
    this.methodC = function()
    {
        document.write('method C<br />');
    }
}
// 関数をインスタンス化
var c = new C();

function D()
{
    // Cのインスタンスからメソッドをコピー
    this.methodD = c.methodC;
}
    
var d = new D();
d.methodD(); // method C