• JavaScript面向对象初体验(一):构建类


    JavaScript不同于其他的面向对象语言,没有类的实现,但是有基于原型的面向对象,这两天看了JavaScript设计模式和阮一峰老师的JavaScript面向对象的总结,现在总结一下这两天自己学到了什么。

    JavaScript中没有块级作用域,但是有函数作用域,也就是说在一个函数里面的变量,在函数外部是无法访问到的,利用这个特性,我们可以做到实现私有变量和私有方法。

    function Cat()//Cat类的实现
    {
            var name=cat;//私有变量
            play:function(){};//私有方法  
    }

    既然实现了私有方法和私有变量,那么我们怎么可以实现公有方法和公有变量呢?

    这时候我们就用到了this,用this创建的变量和方法,在类创建对象的时候,每个对象自身都拥有一份并且可以在外部访问到,因此我们可以把这些变量看做公有变量和方法,而且这些变量和方法可以访问到对象自身的私有属性和私有方法,所以我们称这些方法为特权方法。

    function Cat(name)
    {
       this.play=function(){};//特权方法
       this.name=name;//对象公有属性
    }

    在类外用点方法添加的方法和属性通过new创建的对象没有执行到,所以,通过新创建的类无法访问到这些方法,这些方法称为静态公有方法,这些属性称为静态公有属性

    //以下直接引用了JavaScript设计模式里的原例子
    Book.isChinese=true;//类静态公有属性(对象不能访问)
    Book.resetTime=function(){};//类静态公有方法(对象不能访问)
    Book.prototype={
      //公有属性
      isJSBook:false,
      //公有方法
      display:function(){};    
    }

    那么我们如何利用闭包来实现一个类的构建呢?

    //同样引用了JavaScript设计模式里的例子
    var Book=(function(){
    //静态私有变量
    var bookNum=0;
    //静态私有方法
      function checkBook(name)
      {}
      //返回构造函数
      return function(newId,newName,newPrice)
      {
        //私有变量
        var name,price;
        //私有方法
        function checkID(id){};
        //特权方法
        this.fun=function(){};
      }
    })();
    Book.prototype={
      //静态公有属性
      isJSBook:true,
      //静态公有方法
      display:function(){};
    }

    上述例子原型属性和闭包分割开来,给人的感觉并不太好,那么,如何用闭包来实现一个完整的不分割开来的类呢

    //同样引用了JavaScript设计模式里的例子
    var Book=(function(){
    //静态私有变量
    var bookNum=0;
    //静态私有方法
      function checkBook(name)
      {}
      //返回构造函数
      function _book(newId,newName,newPrice)
      {
        //私有变量
        var name,price;
        //私有方法
        function checkID(id){};
        //特权方法
        this.fun=function(){};
      }
      _book.prototype={
        //静态公有属性
        isJSBook:true,
        //静态公有方法
        display:function(){};
      }
    return _book;//返回这个类
    })();
     
  • 相关阅读:
    【转】教你爱上Blocks(闭包)
    【转】iOS Developer:真机测试
    bzoj1231 混乱的奶牛
    bzoj2064 分裂
    洛谷P2051 中国象棋
    洛谷P2607 骑士
    洛谷P1879 玉米田
    洛谷P3694 邦邦的大合唱
    openjudge dp水题记录
    bzoj1191 超级英雄
  • 原文地址:https://www.cnblogs.com/xcxjy/p/6974306.html
Copyright © 2020-2023  润新知