【问题标题】:Issue in inheritance in javascriptjavascript中的继承问题
【发布时间】:2013-02-15 17:20:54
【问题描述】:

我在 javascript 中使用继承。我陷入了一种情况,我必须检查第一个对象是否在第二个对象中继承。示例:

   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 的第二个对象,即ChildCollection[1].Check()。如果我清楚或没有错,那么第一个警报应该是假的,第二个警报应该是真的。

请指导我解决这个问题,如果我完全走错了路,请向我解释我做错了什么?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    在上面的代码中,我创建了 2 个父类和子类。子继承父。

    你这样做的方式非常非常不寻常。每次使用之前,您都会为Child 提供一个新的和不同的原型。这可能不是你想要做的。 This other answer here on Stack Overflow 提供了在 JavaScript 中进行继承的“通常”方式的示例。我还编写了一个名为 Lineage 的帮助脚本来减少所涉及的输入。

    我创建了一个包含所有子对象的全局 ChildCollection 数组。

    它不是全局变量,它是您的 ready 回调(您传递给 $() 的函数)中的一个变量。它无法从您定义了ParentParent 访问,因此这一行:

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

    ...将失败并返回 ReferenceError

    您可以通过以下三种方式之一解决此问题:

    1. ChildCollection 作为参数传递给Parent 构造函数。

    2. ChildCollection 真正成为全球性的(我会避免这样做)。

    3. 将您的 ParentChild 函数移入您的 ready 回调,以便他们可以访问它。

    实际上,为了避免创建全局变量(ParentChild)但避免 Parent 依赖于伪全局变量,您可以将 #1 和 #3 结合起来。

    重新代码注释:

    在这里我想检查 self 是否是对象 继承于 ChildCollection[i]

    我不知道你那句话中的“继承”是什么意思,但如果你想知道self是否在ChildCollection中:

    var found = false;
    for(var i = 0; !found && i < ChildCollection.length; i++) {
        if (ChildCollection[i] === self) {
            found = true;
        }
    }
    alert(found);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多