【问题标题】:Javascript: Access function within deep object on parseJavascript:解析时深层对象内的访问函数
【发布时间】:2015-06-19 12:05:18
【问题描述】:

我有一个对象

var object1 = {
  object2: {
    function1: function(a, b, c, d, e) {
      //do some stuff with those parameters
      console.log('values are ' + a + ' ' + b + ' ' + c + ' ' + d);
    },
    function2: object1.object2.function1(2, 3, 4, 5)
  }
}

为什么function2: object1.object2.function1(2, 3, 4, 5) 行会抛出Uncaught TypeError: Cannot read property 'object2' of undefined,我怎样才能让它工作?

更新:答案已标记。

谢谢

【问题讨论】:

  • object1object1.object2 在您尝试调用 object1.object2.function1(...) 时尚未完全构建。因此出现错误。
  • 你想用那个对象结构解决什么样的问题,或者你只是在做实验?
  • @wZVanG 谢谢,我想这就是我需要的,我会测试并让大家知道。
  • 我想通了。谢谢大家。

标签: javascript oop object


【解决方案1】:

因为定义function2 的范围不包含object1 的定义。然后,当您尝试访问 object1.object2 时,它会抛出错误,因为 object1 未定义

【讨论】:

  • 此外,对象不是在解析时构造的,只有在调用时才会构造。
【解决方案2】:

以下方法可行:

var object1 = {
  object2: {
    function1: function(a, b, c, d, e) {
      //do some stuff with those parameters
      console.log('values are ' + a + ' ' + b + ' ' + c + ' ' + d);
    },
    function2: function(a, b, c, d, e) {
        object1.object2.function1(2, 3, 4, 5);
    }
  }
}
object1.object2.function2();

基本上在您要调用 object1 时它还不存在。这就是您收到此错误的原因。我只是延迟了这一点,将它插入一个函数并稍后显式调用它。

请注意,javascript 不会检查参数,如果它们不匹配就会失败。

【讨论】:

  • 注意:function2 参数未使用
【解决方案3】:
var object1 = {
    object2: {
        function1: function (a, b, c, d, e) {
            //do some stuff with those parameters
            console.log('values are ' + a + ' ' + b + ' ' + c + ' ' + d);
        },
        function2: function () { this.function1(2, 3, 4, 5); return this; }
    }.function2()
}
object1.object2.function1(9, 8, 7, 6, 5);

【讨论】:

    【解决方案4】:

    如果您希望 function2 作为使用预定义参数调用的 function1 的简写,您可以使用 bind

    object1.object2.function2 = object1.object2.function1.bind(null, 2, 3, 4, 5)
    

    如果您需要上下文,请将null 替换为object1.object2

    【讨论】:

    • 这似乎很有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2019-07-29
    • 2011-10-07
    相关资源
    最近更新 更多