5

これを行う方法について、またはこれが可能である場合でも、私の人生への愛の適切な例を見つけることができません. 例の断片からの私の断片的な理解に基づいて、私は次の構造を思いつきました

         var t = function()
         {
             this.nestedOne = function()
             {
                 this.nest = function()
                 {
                     alert("here");
                 }
             }
         } 
         t.nestedOne.nest();

ただし、これは機能していません(明らかに)。誰かが私を正しい方向に向けることができれば幸いです!

4

4 に答える 4

3

これは、次のように簡単に実行できます。

var t = {
    nestedOne: {
        nest: function() {
            alert('here');
        }
    }
};

それ以外の場合、コードは意味がありません。this関数内は関数自体を参照するのではなく、関数が呼び出されるオブジェクトコンテキストを参照します。また、コード内で関数を呼び出すことすらありません。

私が言うならobj.func()thisfuncobjその電話になります。したがって、割り当てはそのオブジェクトのプロパティthis.asd = trueに割り当てられます。true"asd"

ネストされたクラスを実行したい場合は、非常に異なって見えます:

ClassA = (function() {
   function ClassA() {

   }

   ClassA.prototype.method1 = function() {

   };

   function ClassB() {

   }

   ClassB.prototype.method1 = function() {

   };

   return ClassA;
}())

ClassA のみが ClassB のインスタンスを作成できるようになりました。これは、Java のネストされたクラスと同じ目標を達成するはずです。

于 2012-08-26T17:56:38.817 に答える
2

http://jsfiddle.net/CstUH/を参照してください

function t(){
     function f(){
         this.nest = function()
         {
             alert("here");
         }
     }
     this.nestedOne = new f();
 }
var myt=new t();
myt.nestedOne.nest()

編集1:

使用することもできます

new t().nestedOne.nest()

それ以外の

var myt=new t();
myt.nestedOne.nest()

( http://jsfiddle.net/CstUH/1/ )

編集2:

またはさらに凝縮:

function t(){
    this.nestedOne = new function(){
        this.nest = function(){
            alert("here");
        }
    }
}
new t().nestedOne.nest()

http://jsfiddle.net/CstUH/2/

于 2012-08-26T18:00:26.527 に答える
1

JS では、関数はプライム クラス オブジェクトであり、コード内で直接アクセスできます [つまり、リフレクションなどを使用せずに]。

body内に配置したコードはt、実際に実行するときに実行されtます。

t();

を書きましたが、プロパティt.nestedOne,nest()tありません。次のようにする必要があります。nestedOne

var t = {

    nestedOne : {

        nest : function()
        {

            alert("here");

        }        

    }

};

t.nestedOne.nest();                ​

John Resig の Learning Advanced JavaScriptチュートリアルに旅行することをお勧めします。それは私にとって非常に啓発的でした。

于 2012-08-26T18:01:29.297 に答える
0

ディープネスティングの方法の例として、今日書いた単純なコールバックハンドラー。コードスタイルに関しては、ハチの膝ではないことをお詫びします。それにより、概念が少し明確になりました。

    function test () {
      this.that = this;
      this.root = this;

      this.jCallback = new Array(new Array()); // 2d
      this.jCallbackCount = -1;
      this.str = "hello";


      // Callback handler... 
      this.command = {
        that : this, // let's keep a reference to who's above us on the food chain
        root : this.root, // takes us back to the main object

        // add : function() { var that = this; console.log(that.that.str); },
        add : function(targetFnc, newFunc) { 
            var that = this; 
            var home = that.that; // pretty much root but left in as an example of chain traversal.
            var root = this.root; // useful for climbing back up the function chain

            // console.log(that.that.str); 
            home.jCallbackCount++;
            // target, addon, active
            home.jCallback[home.jCallback.length] =  { 'targetFunc' : targetFnc,  'newFunc' : newFunc,  'active' : true, 'id': home.jCallbackCount};

            console.log('cbacklength: ' + home.jCallback.length);
            console.log('added callback targetFunction:[' + targetFnc + ']');

            return home.jCallbackCount; // if we want to delete this later...      
        },

        run : function(targetFnc) {
            var that = this; 
            var home = that.that;
            console.log('running callback check for: ' + targetFnc + '  There is : ' + (home.jCallbackCount + 1) + 'in queue.');
            console.log('length of callbacks is ' + home.jCallback.length);

            for(i=0;i < home.jCallback.length - 1;i++)
            {
              console.log('checking array for a matching callback [' + targetFnc + ']...');
              console.log('current item: ' + home.jCallback[i]['targetFunc'] );
              if( home.jCallback[i]['targetFunc'] == targetFnc )
              {
                 // matched! 
                home.jCallback[i]['newFunc']();
              }

                // console.log(that.that.jCallback[i].targetFunction);
            }
        }
      };

    }

    test.prototype = {
      say : function () {
        var that = this;
        console.log('inside');
        // that.command('doSay');
        that.command.run('doSay');
        console.log(that.str);
      }


    } // end proto



    // BEGIN TESTING **************************************************************************
    // BEGIN TESTING **************************************************************************
    // BEGIN TESTING **************************************************************************
    var testing = new test();


    testing.command.add('doSay', function () { console.log('213123123'); } );
    testing.command.add('doSay', function () { console.log('12sad31'); } );
    testing.command.add('doSay', function () { console.log('asdascccc'); } );


    testing.say();

ライブ: http: //jsfiddle.net/Ps5Uf/

  • 注:コンソール出力を表示するには、Chromeでインスペクターを開き、[コンソール]タブをクリックします。
于 2012-11-02T05:10:43.427 に答える