3

JavaScriptで継承を使用しています。First オブジェクトが Second オブジェクトに継承されているかどうかを確認する必要がある状況に陥っています。例 :

   function Parent(name)
   {
     var self = this;

     self.Name = name;

     self.Check = function() {
       for(var i = 0; i < ChildCollection.length ;i++)
       {
          //here i want to check whether self is the object which is
          //inherited in ChildCollection[i] 

          alert(true or false);
       }
     }
   }

   function Child(name)
   {
     var self = this;

     Child.prototype.constructor = Child;   

     self.Name = name;
   }

   $(function() {       

      var ChildCollection = new Array()

      for(var i = 1; i <= 2 ;i++)
      {
         Child.prototype = new Parent("TestParent_" + i);              
         var child = new Child("TestChild_" + i);
         ChildCollection.push(child);
      }             

       ChildCollection[1].Check();
    });  

上記のコードでは、2 つのクラスParentChild. 子は親を継承します。すべての子オブジェクトを含むグローバルChildCollection配列を作成しました。親クラスには、作成したいチェック関数があります。ChildCollection配列をループして、現在のオブジェクトの意味 (self または this) が継承されているか、現在ループされている子オブジェクトの一部であるかを確認する必要があります。

明確にするために、ChildCollection の 2 番目のオブジェクトで check を呼び出しましChildCollection[1].Check()た。私が明確であるか間違っていない場合、最初のアラートは偽であり、2 番目のアラートは真である必要があります。

この問題を解決するために私を案内してください。私が完全に間違った方向に進んでいる場合は申し訳ありません。何が間違っているのか説明してください。

4

1 に答える 1

0

上記のコードでは、親と子の2つのクラスを作成しました。子は親を継承します。

あなたがそれをしている方法は非常に、非常に珍しいです。Child使用するたびに、新しい異なるプロトタイプを提供します。それはおそらくあなたがやりたいことではありません。Stack Overflowに関するこの別の回答は、JavaScriptで継承を行う「通常の」方法の例を示しています。Lineageまた、タイピングを減らすために呼び出されるヘルパースクリプトも作成しました。

すべての子オブジェクトを含むグローバルChildCollection配列を作成しました。

readyこれはグローバルではなく、コールバック(渡す関数)内の変数です$()Parent定義した場所からはアクセスできないParentため、次の行になります。

for(var i = 0; i < ChildCollection.length ;i++)

...で失敗しますReferenceError

次の3つの方法のいずれかで修正できます。

  1. 引数としてコンストラクターにChildCollection渡す。Parent

  2. 実際ChildCollectionにグローバルにする(これは避けます)。

  3. ParentChild関数コールバックに移動して、readyコールバックにアクセスできるようにします。

実際には、グローバル(ParentおよびChild)の作成を回避Parentし、疑似グローバルに依存することを回避するために、#1と#3を組み合わせることができます。

コードコメントについて:

ここで、selfがChildCollection[i]で継承されるオブジェクトであるかどうかを確認したいと思います。

その文で「継承された」とはどういう意味かわかりませんが、にあるかどうかを知りたい場合selfChildCollection

var found = false;
for(var i = 0; !found && i < ChildCollection.length; i++) {
    if (ChildCollection[i] === self) {
        found = true;
    }
}
alert(found);
于 2013-03-01T08:57:55.690 に答える