现在我们解决了怎样用一个函数创建一个对象,并且可以设置私有属性和公有属性,那我们是不是还缺个继承?
  我们来看这个例子:
    function NewObj()
    {
      this.Base = MyObj
      this.Base()
      this.SetMsg = function(PMsg)
      {
        this.Msg = PMsg
      }
    }
    var Obj = new NewObj()
    Obj.SetMsg("六月初六")
    Obj.ShowMsg()
  这个例子我们结合刚才的那个function MyObj()例子,我们发现NewObj()创建的对象包含MyObj()里需要创建的属性,这是为什么呢?从刚才我们分析的以前的那几个例子当中我们就不难理解为什么这样写就可以轻松实现继承了。因为在NewObj函数运行时,调用了MyObj函数,所以两个函数同时将新对象的属性赋值,这样就模拟了类的继承。
  明眼人一定发现,同样是运行,我为什么不直接写MyObj()来运行,而要写成this.Base = MyObj;this.Base()的方式来运行呢?细想一下,MyObj函数可是定义在<script>标签里的,NewObj函数调用它的时候,MyObj函数里的this可不是新建的对象,而是window对象,如果你这样写,就等于是在window对象里添加属性了,而我们先在NewObj函数运行时给新对象this添加一个属性,并且将MyObj函数引用赋值给他,那这时MyObj是否就成了新对象里的一个方法了?我们运行新对象里的方法,那其this就等于当前对象,这样我们的继承也就模拟出来了。
  当然我们也可以模拟继承多个类,在这我就不多说了。
  至于重载,也就是给对象属性从新赋一个值,我在这就不在做讨论分析了。  在我们给对象属性赋值的时候需要运行一些代码怎么办?
  在其他语言里如VB我们可以用如下代码:
    Class MyObj
      Public cMsg
      Public Property Get Msg
        Msg = cMsg
      End Property
      Public Property Let Msg(PMsg)
        vMsg = PMsg
      End Property
    End Class
  C++可以用运算符重载
  C#可以用get,set关键词等等……
  那我们JavaScript怎么做到呢?我们可以用类似Java分别做set_Msg和get_Msg两个函数来做,当然也我们也可以模拟。
  在我们的Function里有一个属性argument可以帮助我们实现这一梦想,argument这个属性是一个数组,他的值就是我们的函数传进来的参数数组,我们可以用它来模拟实现函数重载。我们可以这样写
function MyObj()
    {
      this.cMsg = ""
      this.Msg=function()
      {
         if(argument.length==1)
         {
           this.cMsg = argument[0]
          }
         return this.cMsg
       }
    }
    var Obj = new MyObj()
    Obj.Msg("leowoo")
    window.alert(Obj.Msg())  看到这里我们也许需要在给属性赋值的时候触发一个事件来运行一个外部函数怎么办?
  我们前面讨论到,JavaScript的变量可以是任意类型的对象,他当然也可以是一个函数引用,所以我们只需要在对象里给出一个空属性让其他程序来给他赋值一个方法就可以了,然后我们再需要运行的地方调用它,虽然他可能不存在。
  代码如下:
    function MyObj()
    {
      this.cMsg = ""
      this.onMsg = null
      this.Msg=function()
      {
         if(argument.length==1)
         {
           if(typeof this.onMsg == "function")
           {
             this.onMsg()
           }
           this.cMsg = argument[0]
          }
         return this.cMsg
       }
    }
    var Obj = new MyObj()
    Obj.onMsg = function()
    {
      window.alert("onMsg")
    }
    Obj.Msg("leowoo")
    window.alert(Obj.Msg())
  当然我们也可以传值给这个事件
  部分代码如下:
    if(typeof this.onMsg == "function")
    {
      this.onMsg(this.Msg)
    }
    …………
    Obj.onMsg = function(PMsg)
    {
      window.alert("onMsg "+PMsg)
    }  好了,现在我们用JavaScript模拟类的实现基本就算结束了,如果还有什么需要补充的或疑问,请联系我QQ:27860381
  有时间我在整理一下JavaScript模拟模板技术是怎样实现的。
                          LeoWoo(六月初六)
                         写于2006年8月3号 下午4点