读书笔记: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:robert@broofa.com

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);
    });
  };
})();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值