Javascript原型,通过不同函数调用时使用

Javascript原型,通过不同函数调用时使用,javascript,function,this,prototype,Javascript,Function,This,Prototype,我正在使用多个原型来管理一些复杂的情况,我在使用“this”时遇到了麻烦。我不是100%确定如何描述,因为我不熟悉正确的术语,但我会试试 函数X有一个指向函数Y内函数的变量。函数Y内的此方法希望访问函数Y范围内的变量,但当我使用此方法时,它指的是函数X 我创建了一个示例,使用原型等等(这就是我发现自己所处的场景)。但是代码很短,因此我将在下面介绍: var Abc = function(options) { alert('2'); options = options || {};

我正在使用多个原型来管理一些复杂的情况,我在使用“this”时遇到了麻烦。我不是100%确定如何描述,因为我不熟悉正确的术语,但我会试试

函数X有一个指向函数Y内函数的变量。函数Y内的此方法希望访问函数Y范围内的变量,但当我使用此方法时,它指的是函数X

我创建了一个示例,使用原型等等(这就是我发现自己所处的场景)。但是代码很短,因此我将在下面介绍:

var Abc = function(options) {
    alert('2');
    options = options || {};
    this.myVar = options.myVar || 'Abc.myVar';
};
Abc.prototype = {
    onEvent: function() {
        alert('myVar: ' + this.myVar);
    }
};
var Xyz = function(options) {
    alert('3');
    options = options || {};
    this.listenFn = options.listenFn || function() {
        alert('x');
    };
    this.myVar = options.myVar || 'Xyz.myVar';
};
Xyz.prototype = {
    execute: function() {
        alert('4');
        this.listenFn();
    }
};
$(document).ready(function(){
    alert('1');
    var a = new Abc();
    var x = new Xyz({listenFn: a.onEvent});

    x.execute();
});
我已经在代码执行的顺序中加入了警报。因此:

  • 文档的开头是否已准备好
  • 是Abc实例的创建
  • 是Xyz实例的创建,其中Abc实例的OneEvent函数被分配给Xyz的listenFn
  • 在调用了execute on Zyz的点内,该点依次调用Xyz的onEvent,并显示this.myVar的值
  • 我的问题是,“this”指的是Abc上的方法中的Xyz实例。我需要能够为Xyz实例设置/获取myVar的值。我怀疑我可能会在创建一个传递到新Xyz语句中的函数时搞得一团糟,从而将Abc实例传递回它自己,但不幸的是,这在我正在使用的情况下是不可能的(也不是很优雅)

    干杯。

    编辑

    这是你问题的答案

    $(document).ready(function(){
        alert('1');
        var a = new Abc();
        var x = new Xyz({listenFn: a.onEvent.bind(a) }); // <------- bind
    
        x.execute();
    });
    

    在不深入研究代码的情况下,我只想说:在JavaScript中找出
    this
    的值非常容易;这完全取决于调用函数的方式

    • 如果您有
      x.foo()
      ,那么无论发生什么*,
      将等于foo内部的
      x

    • 如果您有
      foo()
      ,那么无论发生什么*,
      都将是全局对象,或者在foo内部的严格模式中未定义

    • 如果你说
      new foo()
      ,那么
      这将是一个新对象,其原型将设置为
      foo.prototype

    • 如果你说
      foo.call(a)
      ,那么
      这个
      将是foo内部的
      a
      *,但这在这里并不适用

    *唯一的例外是,如果您将foo声明为

    var foo = function() { }.bind(obj);
    

    然后,您已经将所有foo调用的
    this
    预先绑定为
    obj
    ,并将覆盖上述规则

    那么,当在Abc prorotype上执行从Zyz prorotype上的函数调用的函数时,是否有一种简单的方法来访问Abc实例的myVar?我怀疑我必须将Abc实例作为参数包含在内,但我希望避免这种情况。@Metalskin-不确定-我在您的代码中没有看到这种情况。如果您有
    Abc.prototype.foo=function(){var X=new Xyz();}
    ,那么您当然可以说X.myVar。这就是你的意思吗?不完全是亚当。问题是foo1.prototype有一个“listener”函数。对于给定的foo1实例,该方法被分配给foo2。Foo2调用此方法,因此当foo1.prorotype中定义的方法正在执行时,它引用的是Foo2的实例,而不是foo1。在这种情况下,我需要知道如何访问作用域为foo1的vars。如果您运行JSFiddle,您将看到this.myVar的值是针对foo2实例的,而不是针对foo1实例的。它比另一个更整洁,并且阻止我改变Xyz。我希望只改变函数本身的内部结构,但这会起作用。再次感谢:-)我将使用第二种方法,它更有意义,现在我明白人们为什么这么做了@Metalskin-我的荣幸-很高兴能帮忙!:)
    var foo = function() { }.bind(obj);