0

私はここに来たばかりなので、ルールに違反しないことを願っています...

それは、私が JavaScript でオブジェクトの継承に取り組んでいるためです...そして、このことに対する「私の」ルールを考え出しているところです...そして今、私は「ある種の」問題に直面しています...

これは私がやりたいことです:

私が作成しているオブジェクトの識別子であるメソッド(関数)が好きです。このメソッドはオブジェクトの作成者でもあります...ただし、同じオブジェクトを使用して、オブジェクトが作成した「データ型」をインスタンス化したい(私はコードがもっと説明していると思います...ここに私が立ち往生している部分があります)

    TRecord = function() {
      this.Class = 'TRecord';
      F = function() {};
      F.prototype = arguments[0]; //args is an object (se below)
      return(new F());
    };

    TRecord.create = function(O) { // this method will not be executed as I like
        if(O) alert(O.Class);      // inside above object when define there with
        <new O object created and returned - code missing>
    };                             // this.create = function(){};
                                   // but if defined here it will, se below...

    TMessage = TRecord({
      'Class': 'TMessage',
      'msgID': Number(0),
      'data': Object('Hello')
    });

    aMSG = TRecord.create(TMessage); // the TMessage instance will be created
                                     // with the above method... and
    alert(aMSG.Class);               // will output TMessage...

TRecord 内に TRecord.create 関数を実装できないのはなぜですか?

... source.js全体を投稿するのに問題があります(フォーマットが機能しません)ので、これは当然のことですが、レコードではなく「実際の」関数(クラス)オブジェクト用の他のコンストラクター/クリエーター関数がいくつかあります(データ オブジェクト)... 動作します - これらは実装が少し異なりますが、深い継承がサポートされています...

4

2 に答える 2

0

thisキーワードは、関数が呼び出されるスコープを参照します。あなたの例では:

TMessage = TRecord({...});

TRecord は、globalまたはwindowオブジェクトをスコープとして、または厳密モードで呼び出されますundefinedthisキーワードは、コンストラクター関数内の新しいオブジェクトのみを参照します。これは、キーワードが新しいスコープで呼び出しをボックス化する方法のためですnew

詳細については、https://developer.mozilla.org/en/JavaScript/Reference/Operators/thisを参照してください。

于 2012-07-08T20:54:14.847 に答える
0

何をしようとしているのか正確にはわかりませんがTRecord、ある種のクラスファクトリであると思われます。試す

TRecord = function() {
  var F = function() {};
  F.prototype = arguments[0];
  var result = new F();
  result.Class = 'TRecord';
  return result;
};
于 2012-07-08T20:55:37.170 に答える