调用另一个对象中的函数

时间:2018-05-20 04:07:38

标签: javascript html5 oop web

当尝试调用另一个对象而不是我正在调用的对象中的函数时,我收到以下错误:'ObjectOneInstance未定义。'

我理解一个选项是插入语句

ObjectOneInstance.ObjectTwoInstance = ObjectTwoInstance;

(反之亦然)更改函数以调用类似

的内容

this.ObjectTwoInstance.two_A();

这种方式似乎工作得很好,但我想知道是否有一种不同的方法可以做到这一点在JavaScript领域被认为更好或更合适,因为后一个例子似乎异常且令人困惑。

我最近一直试图使我的Javascript更加面向对象,这可能引起了一些误解,即当应用程序变得更复杂时,面向对象的JavaScript结构如何。

window.onload = function() {

    var ObjectOneInstance = Object.create(ObjectOne);
    var ObjectTwoInstance = Object.create(ObjectTwo);
    ObjectOneInstance.one_A();

}

var ObjectOne = {

    one_A : function(){
        ObjectTwoInstance.two_A();
    }
}

var ObjectTwo = {

    two_A : function(){
        //do something

    }
}

2 个答案:

答案 0 :(得分:1)

当需要定义变量时,这是的范围和理解的好教训。

让我们从最简单的一点开始:

window.onload = function() {
    var ObjectOneInstance = Object.create(ObjectOne);
    var ObjectTwoInstance = Object.create(ObjectTwo);
    ObjectOneInstance.one_A();
}

在javascript中,使用var创建的变量的范围限定为封闭函数。这意味着ObjectOneInstanceObjectTwoInstance仅在您刚创建的函数中可用。除此功能外,它们不存在。

为了解决这个问题,您可以将声明移到函数之外,让所有人都可以看到它们,但是有一个问题:

/* BUT THIS DOESN'T WORK…FOR A DIFFERENT REASON */
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);

window.onload = function() {
    ObjectOneInstance.one_A();
}

现在ObjectOneInstanceObjectTwoInstance在所有内容都能看到它们的范围内,但它们依赖于ObjectOneObjectTwo,这些尚未定义...所以你得到一个不同的错误:

  

TypeError:对象原型可能只是一个Object或null。

关键是让一切都在正确的范围和正确的顺序。这对于javascript来说可能有点微妙,因为在评估对象或调用函数时需要定义对象,这不一定是脚本加载的同时。像unload处理程序这样的javascript中的很多东西是异步发生的,这意味着整个脚本运行,然后 onload处理程序触发。这不应该抛出错误:

window.onload = function() {
  /* ObjectOneInstance is not defined when the script loads, 
     but it will be when onload is called */
  ObjectOneInstance.one_A();
}

var ObjectOne = {
  one_A : function(){
      /* It doesn't matter that ObjectTwoInstance is not defined yet;
         it will be by the time this function is called */
      ObjectTwoInstance.two_A();
  }
}
var ObjectTwo = {
  two_A : function(){
      //do something
  }
}
/* Object create is not in an async handler it runs right away, 
   so ObjectOne and ObjectTwo need to be defined before calling this */
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo)

答案 1 :(得分:0)

为了尝试解决我遇到的问题,我将Object实例移动到了全局范围(在window.onload之上),我收到了错误Object prototype may only be an Object or null: undefined我遇到的根本问题;但是,主要集中在window.onload函数之前没有声明ObjectOne和ObjectTwo。在我这样做并将实例化移动到全局范围后,我没有收到任何错误。感谢@ Nish26指出我正确的方向。

var ObjectOne = {

    one_A : function(){
        ObjectTwoInstance.two_A();

    }
}

var ObjectTwo = {

    two_A : function(){
        //do something
        alert("two_A")

    }
}


var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);

window.onload = function() {

    ObjectOneInstance.one_A();

}