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;//返回这个类
})();
 

 

posted @ 2017-06-10 00:25  小金鱼有点笨  阅读(147)  评论(0编辑  收藏  举报