在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
),则表明:
this
指的是myObject
this
指的是全局对象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>
答案 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();