各大类库的类工厂

类工厂是指用于生成类的函数,我们不能每写一个类都重复以下代码,要好好封装一下!

var  F = function (){}
F.prototype = SuperClass.prototype;
SubClass.prototype = new  F;
SubClass.prototype.constructor = SubClass

Prototype.js1.6之后的类工厂

var  Animal = Class.create({
   initialize: function (name, sound) {
     this .name  = name;
     this .sound = sound;
   },
 
   speak: function () {
     alert( this .name + " says: "  + this .sound + "!" );
   }
});
 
// subclassing Animal
var  Snake = Class.create(Animal, {
   initialize: function ($ super , name) {
     $ super (name, 'hissssssssss' );
   }
});
 
var  ringneck = new  Snake( "Ringneck" );
ringneck.speak();
//-> alerts "Ringneck says: hissssssssss!"
 
var  rattlesnake = new  Snake( "Rattler" );
rattlesnake.speak();
//-> alerts "Rattler says: hissssssssss!"
 
// mixing-in Enumerable
var  AnimalPen = Class.create(Enumerable, { 
   initialize: function () {
     var  args = $A(arguments);
     if  (!args.all( function (arg) { return  arg instanceof  Animal }))
       throw  "Only animals in here!"
 
     this .animals = args;
   },
 
   // implement _each to use Enumerable methods
   _each: function (iterator) {
     return  this .animals._each(iterator);
   }
});
 
var  snakePen = new  AnimalPen(ringneck, rattlesnake);
snakePen.invoke( 'speak' );
//-> alerts "Ringneck says: hissssssssss!"
//-> alerts "Rattler says: hissssssssss!"

通过Class.create来创建一个类与连结一个父类与其他材料构成一个子类。想调用同名父方法,需要在此方法的参数中传入一个$super参数。

dojo的类工厂:

var  F = function (){}
F.prototype = SuperClass.prototype;
SubClass.prototype = new  F();
SubClassprototype.constructor = SubClass

Prototype.js1.6之后的类定义

dojo.declare(
     "TestClass" ,
     null ,
     {
         id: "" ,
         info: { name : "" ,age: "" },
         staticValue:{count:0},
         constructor : function (id,name,age) {
             this .id=id;
             this .info.name=name;
             this .info.age=age            
             this .staticValue.count++; 
              }
     }
);

它有三个参数,类名,父类,与一个对象,里面包含构建这个类的材料。

YUI的类工厂

 
YUI().use( 'oop' , function (Y) {
     var  Bird = function (name) {
         this .name = name;
     };
     Bird.prototype.getName = function (){ return  this .name; };
 
     var  Chicken = function (name) {
         Chicken.superclass.constructor.call( this , name);
     };
     Y.extend(Chicken, Bird);
 
     var  chicken = new  Chicken( 'Tom' );
     Y.log(chicken.getName());
});

supperclass 有两个作用:一是可以用来调用父类的方法,二是可以通过 supperclass.constructor 调用父类的构造函数。一举两得.

不过它相对于其他类工厂来说是非常原始的,只负责连结子类与父类。

Simple JavaScript Inheritance

这是jquery作者搞的东西

 
var  Person = Class.extend({
   init: function (isDancing){
     this .dancing = isDancing;
   },
   dance: function (){
     return  this .dancing;
   }
});
 
var  Ninja = Person.extend({
   init: function (){
     this ._super( false  );
   },
   dance: function (){
     // Call the inherited version of dance()
     return  this ._super();
   },
   swingSword: function (){
     return  true ;
   }
});
 
var  p = new  Person( true );
p.dance(); // => true
 
var  n = new  Ninja();
n.dance(); // => false
n.swingSword(); // => true
 
// Should all be true
p instanceof  Person && p instanceof  Class &&
n instanceof  Ninja && n instanceof  Person && n instanceof  Class

由Class.create来创建父类,然后通过父类的extend方法加个属性包创建子类.

mootools的类工厂

     var  Animal = new  Class({
         initialize: function  (age) {
             this .age = age;
         }
     });
     var  Cat = new  Class({
         Extends: Animal,
         initialize: function  (name, age) {
             this .parent(age); // calls initalize method of Animal class
             this .name = name;
         }
     });
      
     var  cat = new  Cat( 'Micia' , 20);
     console.log(cat.name); // 'Micia'
     console.log(cat.age); // 20

它应该是所有框架中最复杂也是最强大的,涉及的API就有Mutator Extends Implements还有从Type继承过来的extend implement,它内部拷贝父类属性还用到了深拷贝!

Extends: 可以实现父类,也可以调用父类初始化 this.parent()。而且会覆盖父类定义的变量或者函数。

Implements: 实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。

implement: 是用于调整已经创建好的类的原型成员.

extend: 调用子类(非其实例)的extend方法创建一个新的子类.

mass Framework的类工厂

 
$.require( "class,spec" , function () {
  
     var  Shape = $.factory({
         init: function (len) {
             $.log(len)
             this .length = len || 0;
         },
         getLength: function () {
             return  this .length;
         },
         setLength: function (len) {
             this .length = len;
         },
         getArea: function () {
             throw  "Subclasses must implement this method"
         }
     })
  
     var  Triangle = $.factory({
         inherit: Shape,
         init: function (len, hei) { //len属性在父类中已定义,这里可以省去
             this .height = hei || 0;
         },
         getArea: function () {
             return  this .length * this .height / 2
         }
     })
     var  Square = $.factory({
         inherit: Shape,
         getArea: function () {
             return  this .length * this .length;
         }
     });
     var  t = new  Triangle(3, 4)
     $.log(t.getArea(), true )
     var  s = new  Square(4)
     $.log(s.getArea(), true )
});

$.factory为类工厂,参数为一个普通对象,此对象拥有如下可选属性

  • init为新类的构造器,没有默认传入空函数进去
  • inherit为新类的父类
  • extend的参数是一个对象或对象数组,不管怎么样,这些对象的属性只是为新类添加静态成员,或者说它们是添加到类之上的
  • implement的参数是一个对象或对象数组或类(类即函数),这些对象的属性只是为新类添加实例成员,或者说它们是添加到类的原型上.
 
 
标签:  javascript

你可能感兴趣的:(JavaScript)