如果使用嵌套对象的方法,如何使“this”关键字引用当前实例?

时间:2015-07-11 01:04:24

标签: javascript nested prototype this

在JavaScript中,如果我将一个函数附加到一个对象的原型,那么在该函数中,this引用该对象的当前实例。例如:

function RageFest(inquiry) {
    this.inquiry = inquiry;
}

RageFest.prototype.myFunction0 = function () {
    console.log(this.inquiry);
};

new RageFest("you mad, bro?").myFunction0(); // prints "you mad, bro?"

在节点中运行此节点会按预期将you mad, bro?打印到终端。

现在,这就是我遇到麻烦的地方:假设我想引入第二级组织(可能因为RageFest附加了很多方法,我想组织它们。)

RageFest.prototype.myObject = {
    myFunction1: function () { console.log(this.inquiry); },
    myFunction2: function () { console.log(this.inquiry); }.bind(this),
    myFunction3: function () { console.log(this.inquiry); }.bind(RageFest)
};

var ragefest = new RageFest("you mad, bro?");

ragefest.myObject.myFunction1(); // undefined
ragefest.myObject.myFunction2(); // undefined
ragefest.myObject.myFunction3(); // undefined

这些都不起作用!如果我使myObject的三个函数记录this(而不是this.inquiry),则表明:

  • myFunction1:this指的是myObject
  • myFunction2:this指的是全局对象
  • myFunction3:this引用RageFest构造函数

但是,绑定实例(而不是构造函数)有效:

RageFest.prototype.myObject.myFunction4 = function () {
    console.log(this.inquiry);
}.bind(ragefest);

ragefest.myObject.myFunction4(); // prints "you mad, bro?"

根据需要打印you mad, bro?,但感觉就像一个可怕的黑客。它还要求我事先创建RageFest的实例,这很烦人。

所以,我的问题是,有没有办法实现我想要的效果 - 嵌套对象中的函数可以使用this关键字访问当前实例 - 而不需要诉诸这个hackery?< / p>

1 个答案:

答案 0 :(得分:3)

而不是创建嵌套对象创建getter将有所帮助,它将在构造函数中调用并分配给对象属性。

function RageFest(inquiry) {
    this.inquiry = inquiry;
    this.myObject = this.getMyObject();
}

RageFest.prototype.myFunction0 = function () {
    console.log(this.inquiry);
};

RageFest.prototype.getMyObject = function(){
    var that = this;
    return {
      myFunction1: function () { console.log(that.inquiry); },
      myFunction2: function () { console.log(that.inquiry); } 
    }
};

var ragefest = new RageFest("you mad, bro?");
ragefest.myObject.myFunction1();
ragefest.myObject.myFunction2();