如何扩展承包商基类(sqlite3.Database)? nodejs,ES6

时间:2016-07-18 11:44:24

标签: javascript node.js ecmascript-6

我正在尝试制作sqlite3.Database的扩展版本,我希望以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

很明显,上面的语法无法向子类添加方法。 我的问题是:
   - 为什么它不起作用?
   - 如果我在构造函数中添加方法并在使用super()语法调用this.foo = function() {}后怎么办?

1 个答案:

答案 0 :(得分: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())