我正在尝试制作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() {}
后怎么办?
答案 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())