2016-07-18 9 views
0

拡張バージョンsqlite3.Databaseを作成しようとしていますが、できるだけシンプルで読みやすいようにES6の方法でやりたいと思います。請負業者の基本クラス(sqlite3.Database)を拡張する方法は? node6s、ES6

var sqlite3 = require('sqlite3'); 
class DBExtend extends sqlite3.Database { 
    constructor(file) { 
     super(file); 
     this.foo = function() { 
      return 4; 
     } 
    } 
    test() { 
     return 4; 
    } 
} 

var t = new DBExtend("test.db"); //creates an object of DataBase 
console.log(t.foo()); // OK 
console.log(t.test()); // TypeError: t.test is not a function 

明らかなように、上記の構文は、子クラスにメソッドを追加することができない:私の解決策である 。 私の質問は
- なぜ動作しないのですか?
- コンストラクタにメソッドを追加し、の呼び出しの後にthis.foo = function() {}の構文を使用するとどうなりますか?

+1

'sqlite3.Database'は何ですか?それはクラスまたはコンストラクタ関数ですか? –

+0

@ KrzysztofSafjanowskiので、コンストラクタスタイルのクラスを拡張する正しい方法は何ですか? –

+1

コード自体は私にとってはうまく感じられます。私は 'sqlite3.Database'コードを見て、実際のデータベースのインスタンス化のためにCモジュールを使います。使用方法は、拡張できるかどうかに影響を与える可能性があります。私が言っていることの例として、 'class X {constructor(){return new Z(); }};クラスYはX {foo(){return 42; }} '。私は 'var y = new Y();を実行することは決してできません。 'X'は' X'または 'Y'インスタンスではなく新しい' Z'インスタンスを返します。 –

答えて

0

JavaScriptのプロトタイプの継承とES6クラスを試してみましょう。

いくつかの違いがあります。

  • クラスは唯一
  • 別のクラスによって拡張することができます何スーパーキーワード

クラスは常にプロトタイプを拡張し、原型継承のための唯一の砂糖がありませんほぼ同じように動作します。

'use strict' 
 

 
function Parent(arg) { 
 
    this.arg = arg 
 
} 
 

 
Parent.prototype.parent = function() { 
 
    return this.arg.toUpperCase(); 
 
} 
 

 
Parent.prototype.child = function() { 
 
    return 'Access to original method' 
 
} 
 

 
class Child { 
 
    constructor(arg) { 
 
    this._super_.constructor.call(this, arg) 
 
    } 
 
    parent() { 
 
    return 'Result of acccess to parent method: ' + this._super_.parent.call(this) 
 
    } 
 
    child() { 
 
    return "Access to overloaded method" 
 
    } 
 
} 
 

 
function extend(parent, child) { 
 
    Object.setPrototypeOf(parent.prototype, child.prototype) 
 
    child.prototype._super_ = parent.prototype 
 
} 
 

 
extend(Parent, Child) 
 

 
let b = new Child('initial value') 
 
console.log(b.child()) 
 
console.log(b._super_.child()) 
 
console.log(b.parent())

+0

IMOの場合、元のes6メソッドの宣言方法がこのケースでは機能しない場合は、子コンストラクタで 'super()'の後に 'this.bar = function(){}'を使うとより良く見えます。 –

+0

これはOPの質問にどのように答えますか?あなたはこの答えを実証しようとしていますか? –

+0

@FelixKling - 答えは、親クラス/関数から新しい作成されたメソッドまたはメソッドにアクセスする方法を示します。 –

関連する問題