2012-05-03 11 views
0

私は何かを呼び出すことによって配列を埋めることができるようにしたいと思います。オブジェクトのオブジェクト?多分ネストされたオブジェクトですか? javascriptで

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

可能性として以下、

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

Iはまた(その.OPTIONを必要とする)は、コードのみのコンテキスト内で、それが可能であってはならない、すなわち、necessaryLevel2からアクセスすることができます

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' ] 

私は私がバーに入るものを繰り返すことができますように、オプション機能を追加されるとのトラブルを抱えています()、 例:

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

、まだ

+0

'neededLevel()'と 'necessaryLevel2()'は関数なので、あなたは知っています。また、私はあなたの質問を理解していません。 *配列を書き込む*、どの配列ですか? – Nadh

+0

出力に「...」とは何ですか? –

+0

...は「その他」です。私はそれらを取り出します。 – csta

答えて

1

ここで取得するものです( '・ラ・')のfoo(9.9).BARを入力するための柔軟性を持っていますあなたが開始しました:このバージョンで

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のネイティブプロパティやメソッドを上書きしたくない場合、あなたはあなたの特性を命名して注意する必要があります(例えばvalue,option)。

JSオブジェクトモデル

はまたここに正しい用語を入れ子になっていますか?

種類。 JSでは、ファンクションはファーストクラスのオブジェクトです。つまり、ファンクションに渡したり、オブジェクトのプロパティに割り当てることができます。関数であるoptionプロパティを持つオブジェクトを返す関数です。

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

var tag = { 

    value : { 

    option : {} 

    } 

}; 

したがって、たとえば、あなたは次のようにoptionにアクセスすることができるだろう:あなたは、各プロパティとしての機能を持つオブジェクトを返す関数の階層のために求めている

tag.value.option 

。だから、その場合には、optionに到達するために、あなたがこれを行う必要があるだろう:

tag().value().option 

そして、この場合は、optionは機能ではなく、汎用オブジェクトです。

JS機能を使用すると、parathesisとvar a = (function(heir){...})(['a','b','c'])を行うときに、それはいわゆる

を表現しますか?

「Immediately-Invoked Function Expression(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. 、されることを保証しています場合でも、最後の例のように式として評価されると、関数自体ではなく関数の戻り値が式の値であることをより明白にするために、この場合、値は変数)。Immediately-Invoked Function Expression (IIFE)、その名前(生命維持)することにより、この構造を呼び出すことを示唆しているベンAlman、によって:

トピックに関する良い記事があります。

+0

フル・コールは、 "tag( 'a'、 'nameVal')value( 'function_name'、[funarg1、funarg2])オプション(2)です。したがって、オプションは配列に入る内容を繰り返し、同時に要素にラベルを付けます。オプション(2)に渡される2の値は、繰り返し回数を決定します。 – csta

+1

私は、繰り返しを実行する更新された例を追加しました。それは "function_name"部分にラベルを付けます。そして、あなたは何とか同様に引数にラベルを付けることができます。 – JMM

+0

ありがとう! parathesisを使って "var a =(function(heir){...})(['a'、 'b'、 'c'])を実行すると、何が呼び出されますか? – csta

関連する問題