`
openxtiger
  • 浏览: 147398 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[原创]类似Java语法的Javascript框架js5

阅读更多

最近闲来无事,写一个类似Java的语法的Javascript框架js5,欢迎大家指正:

 

已出第二版本:http://openxtiger.iteye.com/blog/1707172

 

主代码:

 

 

var Js5 = {version:"5.0.0"};
var __cpackage__;
var __classes__ = {};
var __imports__ = [];

Js5.apply = function(o, c) {
    if (o && c && typeof c == 'object') {
        for (var p in c) {
            o[p] = c[p];
        }
    }
    return o;
};

(function() {

    Js5.apply(Js5, {
        applyIf : function(o, c) {
            if (o) {
                for (var p in c) {
                    if (!Js5.isDefined(o[p])) {
                        o[p] = c[p];
                    }
                }
            }
            return o;
        },
        extend : function() {
            var oc = Object.prototype.constructor;
            return function(sb, sp, overrides) {
                var coverrides = overrides;
                if (!overrides) {
                    coverrides = sp;
                    sp = sb;
                }
                var F = function() {
                },sbp,spp = sp.prototype;
                F.prototype = spp;

                coverrides = coverrides(spp) || {};
                if (!overrides) {
                    sb = coverrides.constructor != oc ? coverrides.constructor : function() {
                        sp.apply(this, arguments);
                    };
                }
                sbp = sb.prototype = new F();
                sbp.constructor = sb;
                //sb.superclass = spp;
                if (spp.constructor == oc) {
                    spp.constructor = sp;
                }

                /*sbp.superclass = (function() {
                 return spp;
                 });*/

                Js5.override(sb, coverrides);  // extend coverrides

                return sb;
            }
        }(),
        override: function(origclass, overrides) {
            if (overrides) {
                var p = origclass.prototype;
                Js5.apply(p, overrides);
            }
        },
        /*override : function(origclass, overrides) {
         if (overrides) {
         var p = origclass.prototype;
         overrides = overrides(p.superclass);

         Js5.apply(p, overrides);

         if (Js5.isIE && overrides.hasOwnProperty('toString')) {
         p.toString = overrides.toString;
         }
         }

         },*/
        isString : function(v) {
            return typeof v === 'string';
        },
        isBoolean : function(v) {
            return typeof v === 'boolean';
        },
        isElement : function(v) {
            return !!v && v.tagName;
        },
        isDefined : function(v) {
            return typeof v !== 'undefined';
        },
        isObject : function(v) {
            return !!v && Object.prototype.toString.call(v) === '[object Object]';
        },
        isDate : function(v) {
            return toString.apply(v) === '[object Date]';
        },
        isPrimitive : function(v) {
            return Js5.isString(v) || Js5.isNumber(v) || Js5.isBoolean(v);
        },
        isNumber : function(v) {
            return typeof v === 'number' && isFinite(v);
        },
        isEmpty : function(v, allowBlank) {
            return v === null || v === undefined || ((Js5.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
        },
        isArray : function(v) {
            return toString.apply(v) === '[object Array]';
        },
        isIterable : function(v) {
            //check for array or arguments
            if (Js5.isArray(v) || v.callee) {
                return true;
            }
            //check for node list type
            if (/NodeList|HTMLCollection/.test(toString.call(v))) {
                return true;
            }
            //NodeList has an item and length property
            //IXMLDOMNodeList has nextNode method, needs to be checked first.
            return ((typeof v.nextNode != 'undefined' || v.item) && Js5.isNumber(v.length));
        },
        each : function(array, fn, scope) {
            if (Js5.isEmpty(array, true)) {
                return [];
            }
            if (!Js5.isIterable(array) || Js5.isPrimitive(array)) {
                array = [array];
            }
            for (var i = 0, len = array.length; i < len; i++) {
                if (fn.call(scope || array[i], array[i], i, array) === false) {
                    return i;
                }
            }
            return [];
        },
        namespace : function() {
            var o, d;
            Js5.each(arguments, function(v) {
                d = v.split(".");
                o = window[d[0]] = window[d[0]] || {};
                Js5.each(d.slice(1), function(v2) {
                    o = o[v2] = o[v2] || {};
                });
            });
            return o;
        },
        nameclass:function(c) {
            if (__classes__[c]) return __classes__[c];
            var d = c.split(".");
            var o = window[d[0]] = window[d[0]] || {};
            Js5.each(d.slice(1, d.length - 1), function(v2) {
                o = o[v2] = o[v2] || {};
            });
            return __classes__[c] = o[d[d.length - 1]];
        },
        importclass:function(c) {
            if (__classes__[c]) return __classes__[c];
            var d = c.split(".");
            var o = window[d[0]] = window[d[0]] || {};
            Js5.each(d.slice(1, d.length - 1), function(v2) {
                o = o[v2] = o[v2] || {};
            });
            o = __classes__[c] = o[d[d.length - 1]];
            if (!o) {
                Js5.each(__imports__, function(i) {
                    if ((o = i[d[d.length - 1]])) {
                        return false;
                    }
                });
            }
            return o;
        }
    });

    Js5.ns = Js5.namespace;
})();


/**
 * p1:String ==>package name
 * p2..p-1,Object ==>imports
 * p-1,function ==> package body
 */
function jpackage() {
    var l = arguments.length,i = 0;
    if (l == 0) return;
    var pkf = arguments[l - 1];
    if (Js5.isString(arguments[0])) {
        __cpackage__ = Js5.namespace(arguments[0]);
        i = 1;
    } else {
        __cpackage__ = window;
        i = 0;
    }
    var args = [],vs,ip;
    Js5.each(Array.prototype.slice.call(arguments, i, l - 1), function(v) {
        if (Js5.isString(v)) {
            vs = v.split(";");
            Js5.each(vs, function(v2) {
                if (v2.substr(-2) == ".*") {
                    ip = Js5.namespace(v2.substring(0, v2.length - 2));
                    __imports__.push(ip);
                    args.push(ip);
                } else {
                    args.push(Js5.importclass(v2));
                }
            });
        } else {
            args.push(v);
        }
    });
    pkf.apply(__cpackage__, args);

    __cpackage__ = null;
    __imports__ = [];

}
/**
 * p1:String ==>class name
 * p2,String ==>same package;Object
 * p3,function ==>
 */
function jclass() {
    var l = arguments.length,i = 0;
    if (l < 2) return;
    var clf = arguments[l - 1];

    var c;
    if (Js5.isString(arguments[0])) {
        c = __cpackage__;
    } else {
        c = window;
    }

    var p;
    if (l == 3) {
        var name = arguments[1];
        if (Js5.isString(name)) {
            p = __cpackage__[name];
            if (!p) {
                p = Js5.importclass(name);
            }
        } else {
            p = arguments[1];
        }
    } else {
        p = Object;
    }
    if (!p) {
        throw new Error("[jclass] unrecognized parent class");
    }
    c[arguments[0]] = Js5.extend(p, clf);
}

function jnew() {
    var l = arguments.length,i = 0;
    if (l == 0) return {};

    var args = Array.prototype.slice.call(arguments, 1);

    var name = arguments[0];

    var cls;
    if (Js5.isString(name)) {
        if (__cpackage__ && __cpackage__[name]) {
            cls = __cpackage__[name];
        }

        if (!cls) {
            cls = Js5.importclass(name);
        }
        if (!cls) {
            throw new Error("[jnew] unrecognized  class");
        }
    } else {
        cls = name;
    }


    /*var temp = function() {
     };

     var constructor = cls.prototype.constructor;
     var instanceCls = function() {
     return constructor.apply(this, args);
     };

     temp.prototype = cls.prototype;
     instanceCls.prototype = new temp();
     instanceCls.prototype.constructor = instanceCls;

     return new instanceCls();*/

    var obj = {};
    Js5.override(obj, cls);
    obj.__proto__ = cls.prototype;
    cls.apply(obj, args);
    return obj;


}
例子:

 

 var jui = {};

  jpackage("jui", function() {

    jclass("Component", function() {
      return {
        constructor:function(x) {
          console.log("Component:" + x);
        },
        show:function() {
          console.log("Component");
        }
      }
    });

    jclass("Container", "Component", function(_supr) {
      return {
        constructor:function(x) {
          console.log("Container:" + x);
          _supr.constructor.call(this, x);
        }
      };
    });

  });

  jpackage("jui", function() {

    jclass("Window", "Container", function(_supr) {
      return {
        show:function() {
          console.log("Window");
        }
      }
    });

  });

  jpackage("jui.form", "jui.*", function() {

    jclass("TextField", "Component", function(_supr) {
      return {
        show:function() {
          console.log("TextField");
        }
      }
    });

  });

  jpackage("jui.ex", "jui.Window;jui.*;jui.form.*", function(_W, j) {

    jclass("Window", "jui.Window", function(_supr) {
      return {
        /*constructor:function(x) {
         _supr.constructor.call(this, x);
         },*/
        show:function() {
          console.log("Window Ex");
          _supr.show();
        }
      }
    });


    var x = jnew("Window", "package jui.ex.Window");
    x.show();

    x = jnew(jui.Window, "jui.Window : new in package, use complete class path");
    x.show();

    x = new jui.Window("jui.Window : new in package, use complete class path");
    x.show();

    x = jnew("jui.Window", "jui.Window: new in package, use complete class path");
    x.show();

    x = new j["Window"]("jui.Window: new in package, use import jui.*");
    x.show();

    x = new _W("jui.Window:  new in package, use import jui.Window");
    x.show();

    x = jnew("TextField", "jui.form.TextField  new in package,use import jui.form.*");
    x.show();


  });

  var x = jnew("jui.ex.Window", "global jui.ex.Window");
  x.show();

 

1
0
分享到:
评论
6 楼 openxtiger 2012-10-28  
刚刚做了修改,让import,支持 .* 功能,这样就更像 Java了
5 楼 openxtiger 2012-10-28  
有几个问题值得思考:
1.同一个包中的,类定义,类继承,类实例化,如何可以不采用包名?
2.在包中,是否可以import相关的类?
3.如何实现包中才能引用的类?
4 楼 openxtiger 2012-10-28  
淫笑琪 写道
垃圾,就是拷贝extJs的源码还好意思说闲来无事写的新框架,你是闲来无事拷贝Ext的源码吧,这种JS水平还好意思在那炫耀呢


哈哈,一看这位兄弟对Extjs很熟悉,我只是模仿了java的package,class,new等关键字。Js5这个对象的确是从extjs引用过来,只是修改了 extend 为闭包继承。Jquery和extjs core也有很多相似之处,所以好的东西当然要借鉴。

3 楼 淫笑琪 2012-10-28  
垃圾,就是拷贝extJs的源码还好意思说闲来无事写的新框架,你是闲来无事拷贝Ext的源码吧,这种JS水平还好意思在那炫耀呢
2 楼 openxtiger 2012-10-28  
yingjianxuehun 写道
不错,楼主js实力很强悍。。

谢谢夸奖,我把原型链的继承方式、闭包全部融合进去,而且同一个包的类的命名空间是共享的,主要是通过全局变量“__cpackage__”实现。
1 楼 yingjianxuehun 2012-10-28  
不错,楼主js实力很强悍。。

相关推荐

    KeeperJS一个Javascript简单框架

    KeeperJS,目的以一种亲和Java语法习惯的方式,解决Javascript面向对象的不足,KeeperJS加入了对接口,抽象类的支持,使用起来类似Java习惯。同时进一步丰富Javascript类库,例如KeeperJS实现了Java类库java.util包...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第01章 JavaScript简介及语法(共15页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第01章 JavaScript简介以及基本语法(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第02章 Dom模型,控制客户端元素(共15页).pptx 完整版Java ...

    java开源包5

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    JAVA上百实例源码以及开源项目

     JAVA编写的吃豆子游戏,类似疯狂坦克一样,至少界面有点像。大家可以看截图。 Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色...

    java开源包4

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    JAVA上百实例源码以及开源项目源代码

     JAVA编写的吃豆子游戏,类似疯狂坦克一样,至少界面有点像。大家可以看截图。 Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色...

    基于Java的Elasticsearch ORM框架设计源码

    主要文件类型包括321个JavaScript文件、182个Markdown文档、157个Java源文件、44个HTML文件、33个PNG图片文件、10个XML文件、7个SVG文件、5个CSS文件和2个YAML文件。该项目是一个Elasticsearch搜索引擎框架的ORM框架...

    java经典框架springmvc+mybatis

    Java原理和使用,包括基本的语言、语法知识和API JSP+Servlet,Java Web开发的基础 这方面可以关注Java开发基础专题。 2&gt;服务器: WebLogic的原理、使用和配置 Tomcat:轻量的JavaWeb容器,和WebLogic功能类似...

    java开源包11

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包6

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包9

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包101

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包8

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包10

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    基于Java的Elasticsearch搜索引擎ORM框架设计源码

    这些文件详细展示了如何使用JavaScript、Java、HTML和CSS构建一个Elasticsearch搜索引擎ORM框架,该框架提供索引全自动智能托管,与Mybatis-plus一致的API,屏蔽语言差异,开发者只需要会MySQL语法即可完成对Es的...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第07章 JSP语法及运行过程(共13页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第01章 JavaScript简介以及基本语法(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第02章 Dom模型,控制客户端元素(共15页).pptx 完整版Java ...

    java开源包1

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包3

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第01章 JavaScript简介以及基本语法(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第02章 Dom模型,控制客户端元素(共15页).pptx 完整版Java ...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第17章 自定义orm框架(共11页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第01章 JavaScript简介以及基本语法(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第02章 Dom模型,控制客户端元素(共15页).pptx 完整版Java ...

Global site tag (gtag.js) - Google Analytics