我尝试从回调中的扩展类访问方法:
Model.findOne( { _id: id }, function( err, rec ){
super.handleFind( err, rec );
});
当我编译打字稿时,我看到以下错误:
error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions.
当我运行 JavaScript 时,我得到:
TypeError: Cannot read property 'call' of undefined
如果 - 在回调之前 - 我做了一些类似 let fct = super.handleFind; 它似乎有效,但这在handleFind()中未定义 - 我需要这个上下文。
假设handleFile
是在父类中定义的,然后它将被您的子类继承,除非您要覆盖子类中的handleFile
并且您想改用超类中的handleFile
实现,那么您可以使用 this.handleFile
调用它。
第二个问题是你正在向Model.findOne
传递一个function() {...}
回调,如果你想保留this
上下文(让它指向你的子类的当前实例),请使用箭头函数代替,所以把你的函数改成这个
// Use arrow function to make 'this' point to the current instance of the
// enclosing class
Model.findOne( { _id: id }, ( err, rec ) => {
super.handleFind( err, rec );
});
Function.prototype.call()
调用传递给.findOne()
的匿名函数,并将上下文设置为 this
: Model
class
class Test {
constructor() {}
handleFind(err, rec) {
console.log(err, rec)
}
}
class Model extends Test {
constructor() {
super()
}
findOne(id, fn) {
fn.call(this, id, "err")
}
}
var model = new Model();
model.findOne({id: 123}, function(err, rec) {
this.handleFind(err, rec)
});