Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:当“this”被“call”覆盖时,如何获取对父对象的引用?_Javascript_Scope_Closures - Fatal编程技术网

Javascript:当“this”被“call”覆盖时,如何获取对父对象的引用?

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() {

好吧,我现在讨厌Javascript,我希望有人能帮我

我有如下设置的代码:

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;
    }
}