`

掺元类设计

阅读更多
 var Mixin = function(){};
   Mixin.prototype = {
       serialize : function(){
           var output = [];
            for(key in this){
                      output.push(key + ':' + this[key]);
             }
             return output.join(",");
         }
    }
   
   function augment(rec, giv){
       for(var methodName in giv.prototype){
           if(!rec.prototype[methodName])
                     rec.prototype[methodName] = giv.prototype[methodName];
         }
    }
   
   function augmentPro(rec, giv){
      if(arguments[2]){
          for(var i = 2, len = arguments.length; i < len; i++){
                     rec.prototype[arguments[i]] = giv.prototype[arguments[i]];
          } 
          }else{
                  for(var methodName in giv.prototype){
                            if(!rec.prototype[methodName])
                                  rec.prototype[methodName] = giv.prototype[methodName];
          }
      }
   }
   
   function Author(name, books){
       this.name = name;
       this.books = books;
   }
   
   Author.prototype.getName = function(){
       return this.name;
   }
   
   Author.prototype.getBooks = function(){
       return this.books;
   }
   
   augment(Author, Mixin);
   var a = new Author("li", "book");
   alert(a.getName());
   alert(a.getBooks());
   alert(a.serialize());

这种方式更适合给不同的类来添加一些公共的方法。如果只是给一个类添加的话,就真接用prototype的方式做好了。
augment函数用用for...in来循环遍访giv的prototype中的每个成员,将rec中没有的成员添加进去。
augmentPro是可以选择两个giv中rec想要的成员.
如gugmentPro(Author, Mixin, 'serialize','...')
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics