网络编程
位置:首页>> 网络编程>> JavaScript>> 浅谈javascript面向对象编程

浅谈javascript面向对象编程

作者:oldfish 来源:Alipay UED 发布时间:2009-03-03 12:04:00 

标签:封装,继承,多态,闭包,面向对象,javascript

这周心血来潮,翻看了现在比较流行的几个JS脚本框架的底层代码,虽然是走马观花,但也受益良多,感叹先人们的伟大……

感叹是为了缓解严肃的气氛并引出今天要讲的话题,”javascript面向对象编程”,接下来,我们围绕面向对象的几大关键字:封装继承多态,展开。

封装:javascript中创建对象的模式中,个人认为通过闭包才算的上是真正意义上的封装,所以首先我们先来简单介绍一下闭包,看下面这个例子:

<script type="text/javascript"> 
  function myInfo(){ 
    var name ="老鱼",age =27; 
    var myInfo = "my name is" + name + "i am" + age +"years old"; 
    function showInfo(){ 
      alert(myInfo); 
    } 
    return showInfo; 
  } 
  var oldFish = myInfo(); 
  oldFish(); 
</script>

是不是很眼熟呢?没错了,这其实就是一个简单的闭包应用了。简单解释一下:上面的函数myInfo中定义的变量,在它的内嵌函数showInfo中是可访问的(这个很好理解),但是当我们把这个内嵌函数的返回引用赋值给一个变量oldFish,这个时候函数showInfo是在myInfo函数体外被调用,但是同样可以访问到定义在函数体内的变量。oh yeah!

总结一下闭包的原理吧:函数是运行在定义他们的作用域中而不是调用他们的作用域中。其实返回一个内嵌函数也是创建闭包最常用的一种方法!

如果觉得上面的解释太抽象的话,那么我们一起重塑上面的函数,看看这样是否层次鲜明一些:

<script type="text/javascript"> 
  var ioldFish = function(name,age){ 
    var name = name,age = age; 
    var myInfo = "my name is" + name + "i am" + age +"years old"; 
    return{ 
      showInfo:function(){ 
        alert(myInfo);  
      }    
    } 
  } 
  ioldFish("老鱼",27).showInfo(); 
</script>

上例中的编码风格是ext yui中比较常见的,公私分明,一目了然。通过闭包,我们可以很方便的把一些不希望被外部直接访问到的东西隐藏起来,你要访问函数内定义的变量,只能通过特定的方法才可以访问的到,直接从外部访问写的挺累,饶了一圈终于转回来了,封装嘛,不就是把不希望被别人看到的东西隐藏起来嘛!哈哈……

上例如果转换成JQ的风格的话,应该如下例所写, 这样的封装模式属于门户大开型模式,里面定义的变量是可以被外部访问到的(下面的例子如果你先实例化一个对象,然后在函数外部访问对象的name或者age属性都是可以读取到的)当然这种模式下我们可以设置一些”潜规则”,让团队开发成员明白哪些变量是私用的,通常我们人为的在私有变量和方法前加下划线”_”,标识警戒讯号!从而实现”封装”!

<script type="text/javascript"> 
    var ioldFish = function(name,age){ 
      return ioldFish.func.init(name,age);    
    }; 
    ioldFish.func = ioldFish.prototype ={ 
        init:function(name,age){ 
            this.name = name; 
            this.age = age; 
            return this; 
        }, 
        showInfo:function(){ 
            var info = "my name is" + this.name +"i am " +this.age+"years old"; 
            alert(info); 
        } 
    }; 
    ioldFish.func.init.prototype = ioldFish.func; 
    ioldFish(" 老 鱼",27).showInfo(); 
    //var oldFish = new ioldFish("老鱼",27); 
    //alert(oldFish.name); 
</script>

可能有人会问,哪种模式好呢?这个怎么说呢?两种方式都有优缺点,结合着用呗!总之一个原则,一定一定不能直接被外部对象访问的东西,就用闭包封装吧。”一定一定”四个字很深奥,不断实践中才能体会真谛!

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com