讀書筆記:MVC在前端中的數據存儲於管理部分



         摘自 ----<<基於MVC 的Javascript Web 富應用開發>>

// 首先聲明Object.create()
if(typeof Object.create!="function"){

   Object.create=function(o){
   	
   	var F=function(){};
    
    F.prototype=o;
    
    return new F();

   }

}

//定義對象的複製
Object.prototype.Clone=function(){
	var objClone;
	    if (this.constructor == Object){
	        objClone = new this.constructor(); 
	    }else{
	        objClone = new this.constructor(this.valueOf()); 
	    }
	    for(var key in this){
	        if ( objClone[key] != this[key] ){ 
	            if ( typeof(this[key]) == 'object' ){ 
	                objClone[key] = this[key].Clone();
	            }else{
	                objClone[key] = this[key];
	            }
	        }
	    }
	    objClone.toString = this.toString;
	    objClone.valueOf = this.valueOf;
	    return objClone; 
}

var Model={
      
      inherited:function(){},
      created:function(){
        
      },

      prototype:{

      },

      create:function(){//返回整個對象

      	//首先創建一個實例,繼承this的所有屬性
      	var object=Object.create(this);
        
      	//在實例的parent屬性中,說明用this賦值
      	object.parent=this;
      	//在實例的prototype屬性中,說明,繼承自this的prototype屬性
        object.prototype=object.fn=Object.create(this.prototype);
        
        //每次創建一個新的類,都要重新創建一個存儲緩存數據的對象空間
        object.created();

        this.inherited(object);
        
        return object;
      },
      init:function(){  //返回對象的prototype屬性對象,並調用prototype屬性對象的init方法

      	 //創建一個實例,繼承自this的prototype屬性 
      	 var instance=Object.create(this.prototype);
      	 //在實例的parent屬性,賦值this
         instance.parent=this;
         //調用實例的init方法,傳入當前上下文的環境,以及輸入參數
         instance.init.apply(instance,arguments);

         return instance;
      },

      extend:function(o){//在對象的基礎上擴展屬性
      	  var extended=o.extended;
      	  jQuery.extend(this,o);
      	  if(extended) extended(this);
      },
      include:function(o){//在對象的prototype屬性的基礎上擴展屬性
      	var included=o.included;
      	jQuery.extend(this.prototype,o);

      	if(included) included(this.prototype);

      },
      


}
   //緩存對象的空間
  

   Model.include({
   	   newRecord:true,
       
   	   create:function(){
   	   	    this.newRecord=false;
   	   	    this.parent.records[this.id]=this.Clone();
   	   },
       update:function(){
       	    this.parent.records[this.id]=this.Clone();
       },
   	   destroy:function(){
   	   	     delete this.parent.records[this.id];
   	   },
   	   save:function(){
   	   	  this.newRecord ? this.create() : this.update();
   	   }
   	   
   });

   Model.extend({
             //通過ID查找,找不到拋出異常
             find:function(id){

             	return this.records[id].Clone()||null;

             }

   });
   
   Model.extend({

        created:function(){
          
          this.records=[];
          this.attributes=[];

        }
   });
   //序列化模型屬性,返回所有屬性值,鍵值對

   Model.include({

      attributes:function(){
          
          var result={};
          for(var i in this.parent.attributes){
           
              var attr=this.parent.attributes[i];

              result[attr]=this[attr];

          }
          
          result.id=this.id;
          return result;
      }
   });
   Model.include({
       
        init:function(attributes){
            
            if(attributes){

               for(var name in attributes){
                   this[name]=attributes[name];
               }
               this.id=Math.uuid();
            };
        }
        
   });



/*!
Math.uuid.js (v1.4)
http://www.broofa.com
mailto:[email protected]

Copyright (c) 2010 Robert Kieffer
Dual licensed under the MIT and GPL licenses.
*/

/*
 * Generate a random uuid.
 *
 * USAGE: Math.uuid(length, radix)
 *   length - the desired number of characters,字符長度
 *   radix  - the number of allowable values for each character.二進制,十進制
 *
 * EXAMPLES:
 *   // No arguments  - returns RFC4122, version 4 ID
 *   >>> Math.uuid()
 *   "92329D39-6F5C-4520-ABFC-AAB64544E172"
 *
 *   // One argument - returns ID of the specified length
 *   >>> Math.uuid(15)     // 15 character ID (default base=62)
 *   "VcydxgltxrVZSTV"
 *
 *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
 *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)
 *   "01001010"
 *   >>> Math.uuid(8, 10) // 8 character ID (base=10)
 *   "47473046"
 *   >>> Math.uuid(8, 16) // 8 character ID (base=16)
 *   "098F4D35"
 */
(function() {
  // Private array of chars to use
  var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');

  Math.uuid = function (len, radix) {
    var chars = CHARS, uuid = [], i;
    radix = radix || chars.length;

    if (len) {
      // Compact form
      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
    } else {
      // rfc4122, version 4 form
      var r;

      // rfc4122 requires these characters
      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
      uuid[14] = '4';

      // Fill in random data.  At i==19 set the high bits of clock sequence as
      // per rfc4122, sec. 4.1.5
      for (i = 0; i < 36; i++) {
        if (!uuid[i]) {
          r = 0 | Math.random()*16;
          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
        }
      }
    }

    return uuid.join('');
  };

  // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance
  // by minimizing calls to random()
  Math.uuidFast = function() {
    var chars = CHARS, uuid = new Array(36), rnd=0, r;
    for (var i = 0; i < 36; i++) {
      if (i==8 || i==13 ||  i==18 || i==23) {
        uuid[i] = '-';
      } else if (i==14) {
        uuid[i] = '4';
      } else {
        if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
        r = rnd & 0xf;
        rnd = rnd >> 4;
        uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
      }
    }
    return uuid.join('');
  };

  // A more compact, but less performant, RFC4122v4 solution:
  Math.uuidCompact = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
      return v.toString(16);
    });
  };
})();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章