0

のようなものを呼び出すことで配列を埋めることができるようにしたいと思います。

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

可能性として次の、

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

また、.option()はrequiredLevel2からのみアクセスできる必要があります。つまり、コードのコンテキスト内では、記述できないようにする必要があります。

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')と入力する柔軟性があります

4

1 に答える 1

1

これがあなたが始めるための何かです:

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

ネストされたオブジェクトがある場合、階層は次のようになります。{...}isは、JavaScriptのハッシュ/マップ/辞書の代わりに使用され、順序付けされていない、新しい汎用オブジェクトをインスタンス化するためのオブジェクトリテラル構文です。

var tag = {

  value : {

    option : {}

  }

};

たとえば、次のようにアクセスできますoption

tag.value.option

それぞれがプロパティとして関数を持つオブジェクトを返す関数の階層を求めています。したがって、その場合、に到達するにoptionは、次のことを行う必要があります。

tag().value().option

そしてこの場合、optionは関数であり、汎用オブジェクトではありません。

JS関数式

あなたがvar a = (function(heir){...})(['a','b','c'])パラセシスをするとき、それは何と呼ばれますか?

付けられた名前の1つは、「即時呼び出し関数式(IIFE)」です(以下を参照)。

以下は関数式です。関数オブジェクトを作成します。これを関数に渡したり、変数やオブジェクトのプロパティに保存したりできます。

function ( hier ) {...}

関数式を何にも割り当てずにインプレースで実行することもできます。

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

関数式を実行します。もちろん、必要に応じて戻り値を割り当てることができます。

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

関数式の周りの親にはいくつかの理由があります。

  1. JavaScriptの関数ステートメントと関数式の違いは微妙な場合があります。このように関数をインプレースで呼び出すには、式である必要があり、パレンはそれを確実にする1つの方法です。その他の例は次のとおりです。

    演算子を前に付けます。

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

    課題の右側に配置します。

    var whatever = function ( hier ) {...}( ['a','b','c'] );
    
  2. 最後の例のように、式として評価されることが保証されている場合でも、関数自体ではなく関数の戻り値をより明確にするために、とにかく親を使用するのは良い慣習であると考える人もいます。式の値です(この場合、変数に割り当てられている値)。

このトピックに関する優れた記事があります。ベン・アルマンによる即時呼び出し関数式(IIFE)で、この構成をその名前(IIFE)で呼び出すことを提案しています。

于 2012-05-03T19:57:04.627 に答える