调用另一个对象中的函数

斯宾塞741

当尝试调用位于另一个对象中的函数而不是我正在调用的对象时,我收到以下错误:“未定义 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

    }
}
标记

这是关于何时需要定义变量的范围界定和理解的好课

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

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处于一切都可以看到它们的范围内,但它们依赖于尚未定义的ObjectOneand ObjectTwo……所以你会得到一个不同的错误:

类型错误:对象原型只能是一个对象或 null。

关键是让一切都在正确的范围内和正确的顺序。这对于 javascript 来说可能有点微妙,因为需要在评估对象或调用函数时定义对象,这不一定与脚本加载的时间相同。在像JavaScript很多事情unload处理同步发生,这意味着整个脚本运行,并随后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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章