Javascript 避免在ES6中正确绑定到类的黑客攻击?

Javascript 避免在ES6中正确绑定到类的黑客攻击?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我觉得这相当麻烦。我可能做错了,或者有一种更简单的方法我不知道(没有找到太多不知道要搜索什么的东西) 我希望避免执行以下两种变通方法,以确保此正确指向我的方法中的DB类: this.connect = this.connect.bind(this); db.connect.bind(db) DB类: 'use strict'; const http = require('http'); const MongoClient = require('mongodb').MongoClient;

我觉得这相当麻烦。我可能做错了,或者有一种更简单的方法我不知道(没有找到太多不知道要搜索什么的东西)

我希望避免执行以下两种变通方法,以确保
正确指向我的方法中的DB类:

this.connect = this.connect.bind(this);
db.connect.bind(db)
DB类:

'use strict';

const http = require('http');
const MongoClient = require('mongodb').MongoClient;

class DB {
  constructor(opts){
    this.opts = opts;
    this.dbUrl = process.env.MONGODB_URL;

    // anyway to avoid this hacK?
    this.connect = this.connect.bind(this);
    this.close = this.close.bind(this)
  }

  async connect(ctx, next){
    try {
      ctx.db = await MongoClient.connect(this.dbUrl); // fixes `this` being incorrect here
    } catch(err) {
      ctx.status = 500;
      ctx.body = err.message || http.STATUS_CODES[ctx.status];
    }

    await next();
  }

  async close(ctx, next){
    const result = await ctx.db.close();
    await next();
  }
}

module.exports = DB;
调用
DB
类方法
DB.connect()


哪一种更“正确”,或者是否有第三种方法可以避免这两种解决方法?如果这是将类方法绑定到类的唯一两种方法,那么每种方法的优缺点是什么。

有一系列有用的自动绑定函数。就在今天,我写了一篇文章来改进它们。看一看:

npm安装--保存自动绑定继承

const autoBind=require('auto-bind-heritation')

只需放置
autoBind(此)以及所有方法和方法指针都将绑定到对象,就像您在C++/Java中所期望的那样。这基本上为您调用了
bind


因此,如果您在将方法用作绑定到另一个“this”的回调时遇到问题,此软件包将修复它。

一种更简单的方法是在一个外壳中,即
app.use((…args)=>db.connect(…args))
这看起来非常冗长,只是为了获得
正确的内部
async connect(){}
method…如果我理解正确,仍然不会将其更改为
DB
严重的问题:使用
bind()
真的被认为是一种黑客行为吗?我一直认为,当你失去上下文时,这是一个很好的绑定上下文的方法。我知道替代方法是使用胖箭头函数(
()=>{…}
)或将上下文分配给通过闭包访问的变量(例如,
var context
var\u this
var that
)。。。但对我来说,
bind()
通常是最简洁、最合理的方法。从我被告知的情况来看,这是“正确”的方法(不知道这个具体案例是否适用于“最佳/最简单的方法”),但是,每次在代码库中调用类实例上的方法时,都必须将其绑定到自身,这是非常麻烦的。@chovy我认为您可能会发现一个有趣的潜在解决方案
'use strict';

const Koa = require('koa');
const DB = require('./db');
const db = new DB();
const bodyParser = require('koa-bodyparser');
const router = require('koa-router');

const api = router();
const app = new Koa();
const cors = require('kcors');

app
  .use(bodyParser())
  .use(cors())
  .use(db.connect); // the above constructor copying fixes having to do `db.connect.bind(db)` here

  // without the constructor fix in class DB:

  .use(db.connect.bind(db)) // this gets annoying having to do this everywhere