zoukankan      html  css  js  c++  java
  • 架构整洁之道

    各大类库的类工厂

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

    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
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2679223.html
Copyright © 2011-2022 走看看