读书笔记:MVC在前端中的数据存储于管理部分

来源:互联网 发布:seo系统培训 编辑:程序博客网 时间:2024/06/05 02:16



         摘自 ----<<基于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.commailto:robert@broofa.comCopyright (c) 2010 Robert KiefferDual 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);    });  };})();

原创粉丝点击