【问题标题】:UnCaught TypeError - Nested objects in Javascript? Why is this not allowed? Object literal notation worksUnCaught TypeError - Javascript 中的嵌套对象?为什么不允许这样做?对象文字表示法有效
【发布时间】:2015-11-11 17:25:07
【问题描述】:

玩一些 JS 测试,我试图在我的 v 命名空间中实例化一些嵌套对象。正如您将在下面看到的,ClassA 和 ClassB 按预期工作。当我尝试在另一个属性 (myCustomProperty) 下嵌套一些对象时,我开始遇到问题!谁能解释一下?

以下是原代码:

var v = (v) ? v : {};

v.someClassA = (function() {
   this.hello = function() {
        console.log("Class A Hello!");
    }
});

v.someClassB = (function() {
   this.hello = function() {
        console.log("Class B Hello!");
    }
});

// this all works! 
var myClassA = new v.someClassA();
var myClassB = new v.someClassB();


v.myCustomProperty = (function() {

    function someClassC() {
        this.hello = function() {
            console.log('C');
        }
    }

    function someClassD() {
        this.hello = function() {
            console.log('D');
        }
    }

    return {
        someClassC: someClassC,
        someClassD: someClassD
    }
});

// Uncaught TypeError: v.myCustomProperty.someClassC is not a function! Why?
var myClassC = new v.myCustomProperty.someClassC();
var myClassD = new v.myCustomProperty.someClassD();

myClassA.hello();
myClassB.hello();
myClassC.hello();
myClassD.hello();

如果我将 v.myCustomProperty 的声明更改为使用对象文字表示法,那么一切正常! :

v.myCustomProperty = {
    someClassC: function() {
        this.hello = function() {
            console.log('C');
        }
    },
    someClassD: function() {
        this.hello = function() {
            console.log('D');
        }
    }
 }

我想我的问题实际上是如何使用我原来的 sn-p 中的符号来完成这项工作?可能的?这样做的可怕做法?

谢谢!

【问题讨论】:

    标签: javascript class object constructor object-literal


    【解决方案1】:

    v.myCustomProperty 是一个返回对象的函数。您必须先调用该函数:

    new (v.myCustomProperty().someClassC)();
    //                     ^^
    

    否则,v.myCustomProperty.someClassC() 会尝试访问函数的属性 someClassC,而我们都知道(希望)函数没有这样的属性。


    或者您可能打算立即执行该函数并将对象分配给myCustomProperty

    v.myCustomProperty = (function() {
      // ...
    }()); // <- call function
    

    【讨论】:

    • 是的!恰恰!我刚刚发现了立即调用函数表达式的概念并添加了 ();最后立即调用它。这解决了我的问题。我想这就是你将如何使用构造函数表示法,在这种情况下,而不是对象文字?这是不好的做法吗?
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2012-10-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2021-05-02
    相关资源
    最近更新 更多