【问题标题】:Get instance of a class in another class获取另一个类中的一个类的实例
【发布时间】:2013-03-18 20:15:22
【问题描述】:

编辑:我发现我的代码存在问题 - 请参阅我的答案以获得解决方案。

只是一个简单的问题:

我想访问另一个类中的一个类的实例 - 我该怎么做? 这是我的问题的一个简单示例:

var instanceA = new ClassA();

function ClassA(){
    var instanceB = null;

    this.start = function(){
        instanceB = new ClassB();
        instanceB.start();
    }

    this.action = function(){
        console.log('works not');
    }
} 

function ClassB(){
    this.start = function(){
        instanceA.action(); // this throws: Uncaught ReferenceError: instacneA is not defined 
    }
} 

【问题讨论】:

  • 您是否尝试在实例化时将this(ClassA 的实例)传递给 ClassB?
  • new ClassB().start(); 完美运行。 jsfiddle.net/xHnLt
  • 原来问题是在 jQuery $(document).ready 函数中设置 instanceA 变量。

标签: javascript class instance


【解决方案1】:

将其传递给函数:

this.start = function(instA) { ... }
instanceB.start(instanceA);

或者,如果要在多个方法中重用此实例,请将其传递给构造函数

function ClassB(instA) {
    this.instanceA = instA;
    this.start = function() { this.instanceA.action(); }
}

附:全局变量是邪恶的(大多数时候)。 var instanceA = ... 创建一个。所以,如果它只是一个快速原型 - 没关系。如果没有 - 尽量避免这种情况

【讨论】:

    【解决方案2】:

    虽然当您调用 instanceA.start() - http://jsfiddle.net/infernalbadger/U5aUd/时,您的示例似乎运行良好

    最好将 ClassA 的实例 (this) 传递给 ClassB,而不是依赖全局:

    function ClassA(){
        var instanceB = null;
        var self = this;             // Save instance of ClassA
        this.start = function(){
            instanceB = new ClassB();
            instanceB.start(self);   // Pass to ClassB
        }
    
        this.action = function(){
            console.log('works not');
        }
    } 
    
    function ClassB(){
        this.start = function(a){       // Use passed in instance of ClassA
            a.action(); 
        }
    } 
    

    http://jsfiddle.net/infernalbadger/U5aUd/1/

    【讨论】:

      【解决方案3】:

      好的,对不起 - 我发现了问题:

      我使用 jquery 并在 $(document).ready 函数中创建了 instanceA 变量。

      当我在 $(document).ready 函数之前创建 instanceA 时,它可以工作。

      所以,即使我解决了我的问题,我也不明白。有人可以向我解释为什么我的第一种方法不起作用吗?

      【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2018-11-02
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多