2016-05-18 8 views
1

classobject literalと定義され、コンストラクタのスコープ内にメソッドが定義されています。このように:私はES6 class構文でNodeMappingAbstractを拡張するにはどうすればよいEcmascript 6クラスでオブジェクトリテラルクラスを拡張する方法

var NodeMappingAbstract = function NodeMappingAbstract() { 

    this.mapToContent = function (obj) { 
     throw new Error('Not implemented'); 
    }; 

    this.getInfo = function (data) { 
     throw new Error('Not implemented'); 
    }; 

    this.normalizeUri = function normalizeUri(uri) { 
     return uriNormalizer.normalize(uri); 
    }; 
}; 

class SomeMapping extends NodeMappingAbstract{ 
    constructor(){ 
     super(); 
    } 

    mapToContent(rawElement) { 
     console.warn('mapContent called'); 
     return rawElement; 
    } 
} 
しかし、私はそれをインスタンス化し、このような mapToContent呼び出すとき::私は extendssuper()を使用しようとし

let m = new SomeMapping(); 
m.mapToContent(); 

を私はError: Not implementedを取得し、NodeMappingAbstractの実装が使用されていることを意味します。

+1

私はあなたのコード内の任意のオブジェクトリテラル表示されないのですか? – Bergi

+0

@Bergi 'オブジェクトリテラル'によって、私は 'NodeMappingAbstract'が(インスタンスのプロパティとして)メソッドを定義する方法を意味しました。このパターンを呼び出すより良い方法はありますか? –

+2

「特権メソッドを持つコンストラクタ関数」と呼ばれています。あるいは単に「インスタンス固有のメソッド」(実際にどこに作成されるかは関係ありません)。 – Bergi

答えて

2

あなたのES5クラスのプロトタイプにメソッドを配置する必要があります(いつもそうです)。

あなたは、コンストラクタでそれらを定義し、(プロトタイプから継承されたものをシャドウ)インスタンスのプロパティとしてそれらを作成する場合は、あなたがそれらを上書きするときと同じ操作を行う必要があります:

class SomeMapping extends NodeMappingAbstract{ 
    constructor(){ 
     super(); 
     this.mapToContent = function(rawElement) { 
      console.warn('mapContent called'); 
      return rawElement; 
     }; 
    } 
} 
4

ここで問題がありますファンクションのprototypeではなく、NodeMappingAbstractthis)のインスタンスに直接メソッドをアタッチしていることを確認してください。

JavaScriptがオブジェクトプロパティのルックアップを実行するとき、JavaScriptはオブジェクトを直接検査します。つまり、何かをthisに割り当てると利用可能になります。この方法ですぐに利用できるプロパティが見つからない場合にのみ、prototypeになります。したがって、NodeMappingAbstractを拡張し、class砂糖を使用してprototypeでメソッドを定義しているにもかかわらず、実際にに割り当てられたプロパティは、NodeMappingAbstractのインスタンス内でオーバーライドされません。

ので、関数本体の外側であって、その上にprototypeメソッド宣言を移動:

var NodeMappingAbstract = function NodeMappingAbstract() {}; 

NodeMappingAbstract.prototype.mapToContent = function (obj) { 
    throw new Error('Not implemented'); 
}; 

NodeMappingAbstract.prototype.getInfo = function (data) { 
    throw new Error('Not implemented'); 
}; 

NodeMappingAbstract.prototype.normalizeUri = function normalizeUri (uri) { 
    return uriNormalizer.normalize(uri); 
}; 
+1

彼らが列挙可能かどうかは関係ありません:-) – Bergi

+0

@Bergi Ah!ありがとう! – sdgluck

+0

説明ありがとうございます!私は 'NodeMappingAbstract'をリファクタリングできないと思います。より大きいコードベースで奇妙なパターンで汚染されています。 –

関連する問題