对象的对象?或者可能是嵌套对象?在 JavaScript 中

objects of objects? or maybe nested objects? in javascript

本文关键字:对象 JavaScript 嵌套 或者      更新时间:2023-09-26

我希望能够通过调用类似的东西来填充数组。

necessaryLevel('a','b').necessaryLevel2('name',[X,Y,Z])

以下作为可能性,

necessaryLevel('a','b').necessaryLevel2('name',[X,Y,Z]).option(5)

我还需要 .option(( 只能从 essentialLevel2 访问,也就是说,在代码上下文中不应该编写,

necessaryLevel('a','b').option(5)

我对javascript相当陌生,刚刚开始学习对象和继承。嵌套在这里也是正确的术语吗?

任何指针(没有双关语(?

例:

tag('a','nameVal').value('function_name',[funarg1,funarg2])

输出:

['a','nameVal','function_name',[funarg1,funarg2]]

如果添加了 .option,我可能会得到类似的东西

tag('a','nameVal').value('function_name',[funarg1,funarg2]).option(2)

输出:

['a','nameVal','function_name1',[funarg11,funarg21],'function_name2',[funarg12,funarg22]]

编辑:

玩了一下我有这个(未完成(:

function foo(x){
     return {
          bar:function(y){return [x,y] };
      }
 }
 > foo(9.9).bar('la')
 [ 9.9, 'la' ]

我遇到的问题是添加了一个选项函数,以便我可以重复进入 bar(( 的内容,例:

 > foo(9.9).bar('la').option(4)
 [ 9.9, 'la', 'la', 'la', 'la' ]

并且仍然可以灵活地键入 foo(9.9(.bar('la'(

这里有一些东西可以帮助你开始:

var tag = ( function ( hier ) {
  var array = [];
  var calls = [];

  var repeater = function () {
    return function ( times ) {
      while ( calls.length < times ) {
        hier[1].apply( this, calls.slice( -1 )[0] );
      }
      // for

      return array;
    };
  };

  var adder = function ( child_name, child, repeat ) {
    return function () {
      var args = Array.prototype.slice.call( arguments, 0 );
      var orig_args = [].concat( args );
      if ( repeat ) {
        args[0] += calls.length + 1;
        calls.push( orig_args );
      }

      array = array.concat( args );

      var return_val = [].concat( array );

      if ( child_name !== undefined ) {
        return_val[ child_name ] = child;
      }

      return return_val;
    };
  };

  var last_child, args;
  hier.reverse().forEach( function ( child, index, hier ) {
    var method = index ? adder : repeater;
    args = last_child || [];
    if ( index === 1 ) {
      args.push( true );
    }

    hier[ index ] = method.apply( this, args );
    last_child = [ child, hier[ index ] ];
  } );

  return hier.pop();
} )( [ 'tag', 'value', 'option' ] );

在此版本中,返回数组本身,但是如果您不想覆盖本机属性或Array方法,则必须小心命名属性(例如 valueoption(。

JS对象模型

嵌套在这里也是正确的术语吗?

有点。 在JS中,函数是第一类对象,这意味着您可以将它们传递给函数,返回它们,将它们分配给对象的属性等。 您要求有一个函数tag,该函数返回具有value属性的对象,这是一个函数,该函数返回具有option属性的对象,该属性是一个函数。

如果只有嵌套对象,则层次结构将如下所示。 {...}是用于实例化新的通用对象的对象文字语法,用于代替 JavaScript 中的哈希/映射/字典并且是无序的。

var tag = {
  value : {
    option : {}
  }
};

例如,您可以访问以下option

tag.value.option

您要求一个函数层次结构,每个函数返回一个带有函数作为属性的对象。 所以在这种情况下,要到达 option ,您必须这样做:

tag().value().option

在这种情况下,option是一个函数,而不是一个通用对象。

JS函数表达式

当你用parathes做var a = (function(heir){...})(['a','b','c'])时,它叫什么?

它被赋予的一个名称是"立即调用的函数表达式(IIFE("(见下文(。

下面是一个函数表达式。 它创建一个函数对象,您可以将其传递给函数,保存在变量或对象属性中等。

function ( hier ) {...}

您还可以就地执行函数表达式,而无需将其分配给任何内容:

( function ( hier ) {...} )( ['a','b','c'] )

这将执行函数表达式。 当然,如果需要,您可以分配返回值:

var whatever = ( function ( hier ) {...} )( ['a','b','c'] );

函数表达式周围的括号有几个原因。

  1. JavaScript 中的函数语句和函数表达式之间的差异可能很微妙。 若要像这样就地调用函数,它必须是一个表达式,而括号是确保它是表达式的一种方法。 以下是其他示例:

    用运算符作为前缀:

    +function ( hier ) {...}( ['a','b','c'] )
    

    将其放在作业的右侧:

    var whatever = function ( hier ) {...}( ['a','b','c'] );
    
  2. 即使确保它将作为表达式
  3. 进行计算,如上一个示例所示,有些人认为无论如何使用括号是一个很好的约定,以使函数的返回值而不是函数本身更明显地是表达式的值(在本例中为分配给变量的值(。

关于这个主题有一篇很好的文章:Ben Alman的即时调用函数表达式(IIFE(,他建议用这个名字(IIFE(来称呼这个结构。