JS 闭包

1、js的封装

 门户大开型

    (function() {
      // 门户大开型  为门户打开性添加验证的逻辑实现
      function Person(age,name) {
        this.name = name
        if(!this.checkAge(age)) {
          throw new Error('年龄必须在0到150之间')
        }
        this.age = age
      }
      Person.prototype = {
        checkAge: function(age) {
          if(age>0&&age<150) {
            return true
          }else {
            return false
          }
        }
      }
      Person.prototype['getName'] = function(){
        return this.name || 'ji'
      }
      // var p = new Person(-10,'jim')
      var p = new Person(27,'jim')
      var p2 = new Person(27)
      alert(p2.getName())
    })() 

 用命名规范来区别私有和公有变量

    (function() {
      //用命名规范来区别私有和公有变量
      function Person(name,age,email) {
        //定义私有变量
        this._name;
        this._age;
        this.setName(name)
        this.setAge(age)
        this.email = email;
      }
      Person.prototype = {
        setName: function(name) {
          this._name = name
        },
        setAge: function(age) {
          //如果把验证放在类中 类会越来越臃肿
          if(age>0&&age<150) {
            this._age = age
          }else {
            throw new Error('年龄必须在0到150之间')
          }
        }
      }
      var p = new Person('jim',-1,'jim.com')
    })()

 闭包

   function Person(name,age,email,sex) {
      
      this.email = email; //public变量
      //get
      this.getName = function() {
        return this.name
      }
      this.getAge = function() {
        return this.age
      }
      //set
      this.setName = function(name) {
        this.name = name
      }
      this.setAge = function(age) {
        if(age>0&&age<150) {
            this.age = age
          }else {
            throw new Error('年龄必须在0到150之间')
          }
      }
      
      // 另外一种闭包
      // var _set = "M"
      // this.getSex = function() {
      //   return _set
      // }
      // this.setSex = function() {
      //   _sex = sex
      // }

      //保证程序 先执行set 在执行 get
      this.init = function(){
        // var name = 
        // var age = 
        this.setName(name)
        this.setAge(age)
      }
      this.init()
    }

    var p = new Person('jim',-1,'jim.com')

 

静态化

   (function() {
     function Person(name,age) {
       this.name = name
       this.age = age
       this.showName = function() {
         alert(this.name)
       }
     }
     Person.add = function(x,y) {
      return x+y
     }
     alert(Person.add(10,20)) //静态函数
     //用类中类的方式完成
     var cat = (function() {
       var AGE = 1;
       function add(x,y) {
        return x+y;
       }
       return function() {
         this.AGE = AGE
         this.add = function(x,y) {
          return add(x,y)
         }
       }
     })()

     alert(new cat().add(1,2))
     alert(new cat().AGE)
   })()

 

posted @ 2019-07-16 16:06  suanmei  阅读(253)  评论(0编辑  收藏  举报