Javascript:当“this”被“call”覆盖时,如何获取对父对象的引用?
好吧,我现在讨厌Javascript,我希望有人能帮我 我有如下设置的代码:Javascript:当“this”被“call”覆盖时,如何获取对父对象的引用?,javascript,scope,closures,Javascript,Scope,Closures,好吧,我现在讨厌Javascript,我希望有人能帮我 我有如下设置的代码: function Obj1() { var me = this; this.something = "yay"; this.getThis = function(){ return me; } } Obj1.prototype.method = function() { return this.something; }; function Obj2() {
function Obj1() {
var me = this;
this.something = "yay";
this.getThis = function(){
return me;
}
}
Obj1.prototype.method = function() {
return this.something;
};
function Obj2() {
this.something = "nay";
}
Obj2.prototype.method = function() {
return this.something;
};
var o1 = new Obj1();
var o2 = new Obj2();
document.write(o1.method()); // Returns yay
document.write(o1.method.call(o2)); // Returns nay, but I need "yay" here
JSFiddle@
我的问题是,在第二种情况下,我需要调用Obj1.method,但我绝对无法获取对该对象的引用:
我怎样才能解决这个问题
编辑:对不起,我的示例代码搞错了:更新了。我从上一个答案中提取了大部分代码,因为它更好,并且仍然说明了我的问题。更新的答案:
document.writeo1.method.callo2;//不,但我需要你在这里
你说你现在已经把它整理好了,但是因为这个问题的答案实际上没有在这里显示出来,所以我想我还是更新一下来显示它吧
如果您希望访问我的方法,即使使用不同的this值调用它,您也必须像getThis一样将其定义为对我的闭包:
…当然,如果您不需要将something作为对象的属性,只需将其作为构造函数a中的var,就像我一样:
原始答案:问题的第1版,我没有
但我认为,当我在4中创建闭包时,Javascript应该保留这一点
这完全取决于函数的调用方式,而不是函数的定义位置;更多关于这个和。但是,按照您定义getThis函数的方式,您可以使用它在构造函数调用上关闭的事实来解决这个无双关语,而不使用以下内容:
最新答复:
document.writeo1.method.callo2;//不,但我需要你在这里
你说你现在已经把它整理好了,但是因为这个问题的答案实际上没有在这里显示出来,所以我想我还是更新一下来显示它吧
如果您希望访问我的方法,即使使用不同的this值调用它,您也必须像getThis一样将其定义为对我的闭包:
…当然,如果您不需要将something作为对象的属性,只需将其作为构造函数a中的var,就像我一样:
原始答案:问题的第1版,我没有
但我认为,当我在4中创建闭包时,Javascript应该保留这一点
这完全取决于函数的调用方式,而不是函数的定义位置;更多关于这个和。但是,按照您定义getThis函数的方式,您可以使用它在构造函数调用上关闭的事实来解决这个无双关语,而不使用以下内容:
请参见此处请参见此处问题在于具有范围的此对象的引用发生了更改。 相反,如果在闭包中直接使用this,请使用与此等价的局部变量,即更改Obj1 toL
function Obj1() {
this.something = "yay";
var that = this;
this.method = function() {
return that.something;
}
this.getThis = function(){
return that;
}
}
问题在于具有作用域的this对象的引用发生了更改。 相反,如果在闭包中直接使用this,请使用与此等价的局部变量,即更改Obj1 toL
function Obj1() {
this.something = "yay";
var that = this;
this.method = function() {
return that.something;
}
this.getThis = function(){
return that;
}
}
解决这个问题的唯一方法是让另一个占位符在Obj1中保存这个值,并在函数方法和getThis中使用它 但我不能理解的是为什么要使用itobj1.getThis.callobj2.method? 这明确表示您希望将getThis方法的范围更改为其他内容,然后您正试图解决此用法所产生的问题
你能告诉我你为什么想要这样的东西吗?解决这个问题的唯一方法是让另一个占位符在Obj1中保存这个值,并在函数方法中使用它,然后获取这个值 但我不能理解的是为什么要使用itobj1.getThis.callobj2.method? 这明确表示您希望将getThis方法的范围更改为其他内容,然后您正试图解决此用法所产生的问题
你能告诉我你为什么想要这样的东西吗?是的,我也会这样重写问题中的代码:我更新了我的示例代码,以便用你的代码片段更好地说明我的问题。在我的代码和你的代码中,我根本不能调用getThis方法,当它被覆盖时,这使得它毫无意义。我把前面的示例代码弄糟了,很抱歉。@x3ro:那么问题现在解决了?根据你对这个问题的评论。是的,我也会这样重写问题中的代码:我更新了示例代码,以便使用您的代码片段更好地说明我的问题。在我的代码和你的代码中,我根本不能调用getThis方法,当它被覆盖时,这使得它毫无意义。我把前面的示例代码弄糟了,很抱歉。@x3ro:那么问题现在解决了?根据你对这个问题的评论。如果是的话,那就好了,很高兴这有帮助。事实上,当我在写我的例子时,我出了点问题。我同意你的看法,那根本没有任何意义。。。我将编辑我的问题…事实上,当我写我的例子时,我有点错误。我同意你的看法
一点意义都没有。。。我将编辑我的问题…代码正在执行您要求它执行的操作。您要求javascript引擎调用Obj1中的方法,其作用域为obj2。如果只想在Obj1中调用方法,则可以在Obj1.method处停止,如案例1所示。这就是javascript引擎处理对象作用域的方式,因此,如果在一个对象中调用一个方法,并将作用域作为另一个对象,那么被调用方法中的This关键字将指向作用域对象。是的,我的问题是,我有一些代码是o1.method.callo2,但在该方法中,我需要对o1的引用。无论如何,我通过阅读T.J.Crowder的链接解决了我的问题。非常感谢:D代码正在执行您要求它执行的操作。您要求javascript引擎调用Obj1中的方法,其作用域为obj2。如果只想在Obj1中调用方法,则可以在Obj1.method处停止,如案例1所示。这就是javascript引擎处理对象作用域的方式,因此,如果在一个对象中调用一个方法,并将作用域作为另一个对象,那么被调用方法中的This关键字将指向作用域对象。是的,我的问题是,我有一些代码是o1.method.callo2,但在该方法中,我需要对o1的引用。无论如何,我通过阅读T.J.Crowder的链接解决了我的问题。非常感谢:D
function Obj1() {
var me = this; // <== Use a variable to remember `this`
this.something = "yay";
this.method = function() {
return this.something;
};
this.getThis = function(){
return me; // <== Return it
};
}
function Obj1() {
var me = this;
this.something = "yay";
this.getThis = function(){
return me;
};
}
Obj1.prototype.method = function() {
return this.something;
};
function Obj2() {
this.something = "nay";
}
Obj2.prototype.method = function() {
return this.something;
};
function Obj1() {
this.something = "yay";
var that = this;
this.method = function() {
return that.something;
}
this.getThis = function(){
return that;
}
}
function Obj1() {
var instance = this;
this.something = "yay";
this.method = function() {
return instance.something;
}
this.getThis = function(){
return instance;
}
}