【问题标题】:Define a "nested" object constructor in JavaScript?在 JavaScript 中定义“嵌套”对象构造函数?
【发布时间】:2012-04-07 02:06:18
【问题描述】:

是否可以在另一个对象中定义一个对象?我在想这样的事情:

function MyObj(name) {
    this.name = name;

    function EmbeddedObj(id) {
        this.id = id;
    }
}

然后我可以像这样创建一个 EmbeddedObj:

var myEmbeddedObj = new MyObj.EmbeddedObj();

奖励积分的模因:反对! :o

【问题讨论】:

    标签: javascript object nested


    【解决方案1】:

    是的,也不是。

    function MyObj(name) {
        this.name = name;
    }
    MyObj.EmbeddedObj = function EmbeddedObj(id) {
        this.id = id;
    }
    new MyObj.EmbeddedObj(42);
    

    会运行,但它可能不会产生“嵌入式对象”的预期结果(见评论)。

    请注意,在new expr 的情况下,表达式首先被评估,因此,在这种情况下,它使用从MyObject.EmbeddedObj 评估的函数对象作为构造函数创建一个新对象。 (表达式中有一个带括号的愚蠢规则,但这是另一回事。)


    现在,如果需要“父”和“子”关系,可以使用更迂回的方法来实现:

    function Parent (name) {
       this.name = name;
       var parent = this; // for closure
       this.Child = function Child () {
          this.Parent = parent;
       }
    }
    
    // create new parent object
    var parent = new Parent();       
    // each new parent has a different Child constructor and
    // any function-object can be used as a constructor
    var child = new parent.Child();
    // true: child is "bound" to parent
    child.Parent === parent;
    

    【讨论】:

    • 您能否澄清您所说的“可能不会产生预期结果”的意思?
    • @ElliotBonneville 他们是两个 unassociated 构造函数。 MyObject 命名第一个构造函数,MyObject.EmbeddedObj 命名第二个构造函数,这只是巧合(它也可能是 foobar)。也就是说,它不类似于 Java 中的嵌套类(其中嵌套类是包含“父”类的“子”)。
    • @ElliotBonneville 我已经更新了一个如何设置父/子关系的示例。
    • 太棒了,这正是我想要的!非常感谢。
    【解决方案2】:
    function MyObj(name) {
        this.name = name;
    }
    
    MyObj.EmbeddedObj = function(id) {
        this.id = id;
    }
    
    var myEmbeddedObj = new MyObj.EmbeddedObj();
    

    这看起来像你所追求的吗?

    【讨论】:

      【解决方案3】:

      这是嵌套构造函数的示例。

      function cimdb(name,review,year) {
      
       function nestedConstructor(name,review,year) {
          this.name = name;
          this.review = review;
          this.year = year
      };
      
          this.name = name;
          this[name] = new nestedConstructor(name,review,year);
      
      }
      
      
      
        var lionking = new cimdb("The Lion King", "The lion King review ..", 2015);
      

      我猜这就是嵌套对象构造函数的意思。

      【讨论】:

      • 那么如何从 cimdb 方法之外创建一个nestedConstructor 的实例呢?
      猜你喜欢
      • 2018-02-27
      • 2020-04-22
      • 1970-01-01
      • 2019-04-22
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多