【问题标题】:Getting the Restify Handler Object using "this"使用“this”获取 Restify 处理程序对象
【发布时间】:2016-09-20 06:31:57
【问题描述】:

我使用以下代码设置了 Restify 路由。我创建了一个伪类,实例化对象并将其用作处理程序。我希望对象本身在“ping”函数中绑定到“this”,这样我就可以访问成员变量。但是,“this”最终指向了一些包含路由等的 restify 对象。这是否不适用于 Restify?

    var Handler1 = function() {
       if (!(this instanceof Handler1 )) {
        return new Handler1 ();
       }
       ...
    }
    HttpHandlers.prototype.ping= function(req, res, next) {
            //this doesn't point to the handler1 object.
            return next();
     }
...
    var myhandler1 = new Handler();
    app.get("/ping", myhandler1.ping , handler2);
    handler1.ping.bind(myhandler1 )

【问题讨论】:

    标签: node.js restify


    【解决方案1】:

    我会尝试将对象实例作为路由而不是对象。这对我来说更有意义。

    class Pong1 {
      constructor(name) {
        this.name = name;
      }
      ping = res => res.write(`PONG ${this.name}`);
    }
    
    const pong1 = new Pong1('Pongy);
    app.get('/ping', pong1.ping);
    

    这更像是一个 ES2017 版本,我认为更可取。如果你真的想要,你应该能够转换成更 ES5 的语法。

    【讨论】:

    • @"Jason Livesay",为了简化发布她的代码,我删除了“.ping”。在我们稍后进行代码清理之前,我现在必须使用旧语法。所以我仍然不确定为什么我没有得到上下文。
    • 如果你正在检查 'this' 是否绑定在 .prototype.ping 中,这可能是问题所在,因为你没有绑定原型函数,而是将函数绑定在之后创建的实例上。跨度>
    • "Jason Livesay",所以我尝试在函数声明中添加 .bind(Pong1 )。当我检查“this”时,我现在看到了对象/伪类,但它看起来并不包含对象实例变量。我正在尝试做的是有一种方法来实例化一个“类”,并且它的函数可以访问在构造函数中设置的对象的成员变量。
    • 嗯,有很多方法可以做到这一点,但我演示的方法是我目前可以推荐的唯一方法。我真的建议不要以不同的方式做这件事,因为它通常会让每个必须在 JS 中找出不同类型的 OOP 的人感到困惑,而且它会让你更难。我知道添加 babel 是一件大事。
    【解决方案2】:

    原来我需要传入绑定函数:

    app.get("/ping", myhandler1.ping.bind(myhandler1), handler2);
    

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多