• 我的类库功能预览 ruby风格的继承机制


    创建一个新类,使用dom.factory方法,很明显它是一个工厂方法,批量生产各种各式的类。

          var MyFirstClass = dom.factory({
            message: "hello world",
            sayHello: function() {
              alert(this.message);
            }
          });
          var obj = new MyFirstClass();
          obj.sayHello();//hello world
    

    继承:

          var Animal = dom.factory({
            init: function(name) {
              this.name = name;
            },
            eat: function() {
              alert('yummie');
            }
          });
    
          var Human = dom.factory({
            inherit: Animal,
            speak: function() {
              alert(this.name + ' said bla bla bla');
            }
          });
    
          var peter = new Human('peter');
          peter.eat();//yummie
          peter.speak();//peter said bla bla bla
    
          var Pat = dom.factory({
            inherit: Human,//注意这里,使用inherit方法
            init: function(name,age) {
              this.age = age
            }
          });
    
          var pat = new Pat('pat',18);
          alert(pat.name)//pat
          alert(pat.age)//18
          pat.speak();//pat said bla bla bla
    

    方法链。就是在当前方法调用其父类的同名方法。

         var Girl = dom.factory({
            sayHello: function() {
              return "Hello there";
            }
          });
    
          var FancyGirl = dom.factory( {
            inherit:Girl,
            sayHello: function() {
              return "Well, "+ this.$super() +"!";
            }
          });
          var g = new Girl;
          alert(g.sayHello());
          var f = new FancyGirl;
          alert(f.sayHello());
    

    内部方法:

           dom.require("lang");
          dom.require("oop")
    
          var Person = dom.oop({
            init: function(name){
              this.name = name;
            },
            secret: function(){
              return 'I sometimes like girly drinks';
            }.protect(),  //定义其为内部方法,只能内部调用
    
            describe: function(){
              return "Hi, I'm #{name}. #{secret}. I kid, I kid.".instead({
                name: this.name,
                secret: this.secret()
              });
            }
          });
    
          var scott = new Person('司徒正美');
          // alert(scott.secret());//报错 The method "secret" cannot be called.
          alert(scott.describe());//Hi, I'm Scott. I sometimes like girly drinks. I kid, I kid.
    

    singleton,标识生产的新类为单例类:

          var God = dom.factory({
            init:function(name){
              this.name = name;
              this.alertName = function(){
                alert(this.name)
              }
            },
            singleton:true//注意这里,使用singleton属性
          });
          var god = new God("耶和华");
          god.alertName();      //alerts 耶和华
          var lucifer = new God("撒旦");
          lucifer.alertName();   //alerts 耶和华
          alert(god === lucifer )//alerts true
    

    alias,别名机制:

    
          var Array2 = dom.factory({
            init:function(){
              var args = [].slice.call(arguments);
              this.setArray(args);
            },
            setArray: function (arr) { //把普通对象变成类数组对象,
              this.length = 0;        //必须要让它成为原型方法才可以使用
              [].push.apply(this, arr);
              return this;
            },
            toString: function () { //返回一个字符串
              return [].slice.call(this).toString();
            },
            valueOf: function () {//获得里面的数组对象
              return [].slice.call(this);
            },
            pop:[].pop,
            push:[].push,
            shift:[].shift,
            unshift:[].unshift,
            reverse:[].reverse,
            indexOf: function(el,index){
              var n = this.length,
              i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index;
              for (; i < n; i++)
                if (i in this && this[i] === el) return i;
              return -1;
            }
          });
          Array2.alias("indexOf","contains")
          var a = new Array2(1,2,3,4,5);
          alert(a)//测试toString方法
          alert(a.indexOf(3))
          alert(a.contains(3))//测试别名机制
    

    include,包含,类似ruby,添加原型成员。

          var movable = {
            run:function(){
              alert("能跑")
            },
            fly:function(){
              alert("能飞")
            }
          }
          var recognition  ={
            watch:function(){
              alert("看东西")
            },
            smell:function(){
              alert("能嗅东西")
            }
          }
          var Robot = dom.factory({
            init:function(name,type){
              this.name = name;
              this.type = name;
            },
            include:[movable,recognition]
          });
          var chi = new Robot("小叽","Chobits") ;
          alert(chi.name);
          chi.watch();
          chi.fly();
    

    extend,扩展,类似ruby,添加类成员。

          var MyClass = dom.factory({});
    
          MyClass.extend({
            PI:"3.14",
            alert:function(){
              alert("这是静态(类)方法")
            },
            alertPI:function(){
              alert(MyClass.PI);
            }
          });
          MyClass.alert();//这是静态(类)方法
          MyClass.alertPI();//3.14
          var m = new MYClass
          m.alert()//报错MYClass is not defined
    

    自扩展与自包含:

          var Module = {
            selfIncluded: function(klass) {
              klass.prototype.boo = 'boo';
            },
            selfExtended: function(klass) {
              klass.BOO = 'BOO';
            }
          };
    
          var MyClass = dom.factory({
            include: Module,
            extend:  Module
          });
    
          alert(MyClass.prototype.boo); // -> 'boo'
          alert(MyClass.BOO);           // -> 'BOO'
    
            dom.geometry = {};
            var Point = dom.geometry.Point = dom.factory({
                init: function(x, y) {
                    this.x = x*1.0 || 0.0;
                    this.y = y*1.0 || 0.0;
                },
                toString: function() {
                    return this.x + ' ' + this.y;
                },
                clone: function() {
                    return new Point(this.x, this.y);
                },
                eq: function(point) {
                    return this.x == point.x && this.y == point.y;
                },
                //移动点到新的位置
                offset: function(x, y) {
                    if (typeof x === 'object') {
                        y = x.y;
                        x = x.x;
                    }
                    this.x += x;
                    this.y += y;
                    return this;
                },
                extend:{
                    fromString : function(string) {
                        var parts = string.split(/\s+/);
                        return new Point( parts[0], parts[1] );
                    }
                }
            });
    

    添加原型成员。

    var movable = {
      run:function(){
        p("能跑")
      },
      fly:function(){
        p("能飞")
      }
    }
    var recognition  ={
      watch:function(){
        p("看东西")
      },
      smell:function(){
        p("能嗅东西")
      }
    }
    var Robot = oop({
      init:function(name,type){
        this.name = name;
        this.type = name;
      },
      include:[movable,recognition]
    });
    var chi = new Robot("小叽","Chobits") ;
    p(chi.name);
    chi.watch();
    chi.fly();
    
  • 相关阅读:
    urllib 模块 https://www.cnblogs.com/guishou/articles/7089496.html
    cookies与session的区别
    IPMI的几个问题
    Java 线程池
    fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
    Java-加载数据库驱动,取得数据库连接
    《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
    C# Newtonsoft.Json 解析多嵌套json 进行反序列化
    使用Json.NET来序列化所需的数据
    Newtonsoft.Json.dll 反序列化JSON字符串
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1701894.html
Copyright © 2020-2023  润新知