1. 程式人生 > >javascript面向物件程式設計---封裝--被動封裝+主動封裝

javascript面向物件程式設計---封裝--被動封裝+主動封裝

封裝:把物件內部的資料和操作細節進行隱藏,javascript不支援封裝操作,但可以使用閉包函式來模擬型別封裝

被動封裝:對物件內部資料進行適當約定,這種約定並沒有強制性,它主要針對公共物件而言

var Card=function(name,sex,work,detail){//較為安全的公共類

    if(!_checkName(name)) throw new Error('name值非法')

  this.name=name;

  this.sex=_checkSex(sex);

  this.work=_checkWork(work);

  this.detail=_checkDetail(detail)

}

Card.prototype={//類內部的資料檢測方法

   _checkName:function(name){},

_checkSex:function(sex){},

_checkWork:function(work){},

_chackDetail:function(detail){},

}

主動封裝:函式具有區域性作用域,在函式內部宣告的變數函式外部無權訪問所以真正實現類的封裝設計,使用函式是最佳選擇

var Card=function(name,sex,work,detail){

   var  _name=name,_sex=sex,_work=work,_detail=detail;

  function _checkName(_name){}

 function _checkSex(_sex){}

 function _checkWork(_work){}

function _checkDetail(_detail){}

this.checkName=function(){return _checkName}//可返回私有方法,供外部不呼叫

if(!_checkName(_name))  throw new Error('name值非法')

else{

    this.name=_name;

}

this.sex=_checkSex(_sex);

this.work=_checkWork(_work);

this.detail=_checkDetail(_detail);

}

Card.prototype={//公共方法

}

通過特權函式(公共方法)訪問私有變數

var Card=funciton(){

   var _name=1;

  function _checkName(){ return  _name;}

 this.checkNmae=funciton(){return _name;}//公共方法訪問私有屬性

}

function F(){//子類,類繼承方法繼承

   Card.call(this);

  this.name=_name;//訪問超類中的私有屬性 ,丟擲解析錯誤

}

var a=new F();

alert(a.name);

alert(a._checkName());//無法訪問,解析錯誤

alert(a.checkName());//訪問超類公共方法,間接訪問私有屬性