`
bellstar
  • 浏览: 150972 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个JavaScript的oo库

阅读更多

此项目已更名为May.js,内容已过期,请参见http://zhongxingdou.github.io/mayjs/

 

 

zero是我期望使用javascript自身来改进javascript的一个尝试,目前源码2000行不到.

我尽量使其轻量,不成为一种javascript之上的'新语言'

 

项目源码: https://github.com/zhongxingdou/zero

我的QQ:624998961

QQ讨论群:250988913

Zero

a JavaScript object oriented framework.

features:

  1. keyword method

    zero提供一系列的以$为前缀的类关键字方法,如$class,$module,$interface…

  2. global

    global是Zero的变量管理机制,zero的目标并不包含实现commonjs的规范,$global及其相关关键字方法只是提供一个包管理之外的轻量的对象引用机制,它也不妨碍使用的人使用包管理机制. zero包含三个全局变量,z,$global,$run

     //在闭包内运行一个方法,避免全局变量的问题
     $run(function(){
         eval($global.all); //声明引用$global所管理的对象的变量,以方便在后面的代码中使用
    
         //some code …
    
         $global("obj1", obj1); //声明一个变量交给$global管理
     })
    
     /*
     执行一段代码,run方法会传递包含该段代码方法的签名中引用的$global管理的变量,
     但注意在此段代码中不能引用$global.run之外的非全局变量
     */
     $global.run(function(obj1, obj2, obj3){
         var prop = obj1.prop; 
         obj2.xx(); 
         //...
     })
    
  3. module

     //此关键字并不对传入的模块声明作任何处理,因此符合模块接口的普通对象也可认作是模块
     function $module(o){
         return o;
     }
    
     //使用$module声明一个模块,
     var MAmodule = $module({
         onIncluded: function(){
             this.prop1 = {}; //this为包含此模块的对象
         },
         prop: {},
         method: function(){}
     });
    
     $(obj).include(MAmodule);
    
  4. class

     //此构造函数内调用的方法都是继承自z.Base
     var Class = function(){
         this.callBase(); //调用父类的constructor
    
         this.property("prop"); //声明一个属性prop
    
         this.property({
             "prop1": {},
             "prop2": {
                 get: function(){},
                 set: function(){}
             }
         });
    
         this.include(module); //包含一个模块
     }
    
     Class.prototye = {
         sayHello: function(){
             this.callBase(); //调用父类的sayHello
         }
     }
    
     /* 
      继承z.Base,添加已实现接口名称到类的已实现接口数组
      z.Base是Zero的基础类,建议所有类都继承它
      $class(Class)新建一个包含Class引用并拥有extend,implement,include方法的对象,
      但不会扩展Class本身
      */
     $class(Class).extend(z.Base).implement(AInterface);
    
  5. wrapper

    wrapper是一种对象的扩展机制,可使用$(obj)建立一个引用了obj并包含扩展模块的新对象,它不直接扩展对象本身,$$(obj)则是直接使用模块扩展对象,$和$$是根据所管理的扩展模块的登记信息和对象本身的类型和接口,来决定如何扩展对象的.

     var StringWrapper = $module({
         capitalize: function(){
             var o = this.target;
             return o.charAt(0).toUpperCase() + o.slice(1);
         }
     });
    
     var NumberWrapper = $module({
         next: function(){ return this.target.valueOf() + 1; }
     });
    
     $.regist(StringWrapper, String, "stringWrapper");
    
     $.regist(NumberWrapper, Number, "numberWrapper");
    
     $.setDefault(String, "stringWrapper");
    
     $("string").capitalize();
    
     $(8).wrap("numberWrapper").next();      
    
     var str = $$("string");
     str.capitalize();
    
  6. is

    zero尝试使用$is()统一的类型判断的方式

     //判断对象typeof
     $is('string', 'abc');
    
     //判断对象是否为另一对象的实例
     $is(Function, function() {});
    
     //与特殊对象或值比较
     $is(null, obj);
     $is(undefined, obj);
    
     var spec = $spec({
         "instanceOf": B,
         "prototypeOf": Object.prototype,
         "typeof": "type"
     });
    
     $is(spec, obj); //复合判断
    
  7. interface

    由于动态语言的对象的成员是可变化的,并不能从其类或者构造函数或者原型链来确定它的成员是否存在和是否可用,因此通过显式的接口和对象直接进行比较,更能准确的确定对象是属于某种'类型'.

    另外动态语言对象成员变更的途径多样,不像强类型语言那样容易从代码看出对象的接口,因此显式接口还有一定的文档功能.

    此外接口还可用于方法的参数验证,方法的重载等其他地方.

    接口并不需要一定使用$interface来声明,符合IInteface接口的普通对象也可

     var IBase = $interface({
         member: {
             prop: String, //声明此成员的类型
             method: "function(p1, p2)", //声明此成员的类型为function,其后签名只起文档的作用
             prop3: {
                 type: { //复合的形式描述对象的类型
                     instanceOf: "prop3", 
                     prototypeOf: [Object]
                 },
                 value: {}, //默认值
                 check: function(v){}, //对象值的验证器
                 required: true,  //此成员是否必须存在
                 ownProperty: true //此成员是否为对象自己拥有还是原型链上的
             },
             prop4: {type: [String, Number]} 对象的类型可以为多种 
         },
         type: Object, //对象的类型
         freeze: true, //是否冻结对象,即不让对象拥有member以外的成员
         base: IObject //父接口
     })
    
     //如果只定义member和type,可以用更简单的写法
     var IBase = $interface({
         prop: String,
         method: "function(p1,p2)"
     }, Object)
    
     $support(Interface, aObj); //判断一个对象是否支持某接口
    
  8. function option

    zero约定方法的option属性表示方法参数的interface,有了这个接口,可以方便的实现参数验证,同时支持普通参数传递形式和key/value对象传递参数,还有方法重载,参数组默认值和当前设定的合并.

    zero建议给超过2个参数的方法设定参数接口

     fn = function(p1, p2) {
         var option = $option(); //将参数转换成key/value形式,并和参数接口的默认值合并
         $support(fn.option, option); //判断参数是否符合接口
    
         //option.key1
         //option.key2
         //option.key3
         //...
     }
    
     fn.option = { key1: {value: {}}, key2: {value: {}}, key3: {}}
    
     //也可一次性定义方法与其option
     var fn = $fn(function(){//...}, {key1: {}, key2: {}});
    
     fn("p1", "p2");
    
     fn({
         key3: {},
         key2: {}
     });
    
  9. overwrite

    zero可以通过$overwrite()来生成能够分派重载方法的主方法.

    也可以自定义主方法,使用$dispatch()来手动获取根据当前参数和重载方法的接口选择应该执行的方法,然后手动调用该方法.

         var fnWithStringAndNumber = function(){}
         fnWithStringAndNumber.option = {
             name: 'string',
             age: 'number'
         }
    
         function fnWithTwoString(){
             //do something...
         }
    
         fnWithTwoString.option = {
             name: 'string',
             interest: 'string'
         }
    
         var fn = $overwrite(fnWithStringAndNumber, fnWithTwoString);
    
         fn("jim", 8); //call fnWithStringAndNumber
    
         //使用$dispatch选择要调用的方法
         var fn2 = function(){
             var args = ["jim", 8];
             var fn = $dispatch([fnWithStringAndNumber, fnWithTwoString], args);
             fn.apply(this, args);
         }
    
  10. inspect

    Object.prototype.m = {};
    
    var obj = {p: {}, __p: {}, fn: function(){}, __fn: function(){}};
    
    var o = $inspect(obj);
    
    o.methods();  
    //--> ["fn", "__fn"]
    
    o.publicMethods();
    //--> ["fn"]
    
    o.privateMethods();
    //--> ["__fn"]
    
    o.fields();
    //--> ["p", "__p", "m"]
    
    o.publicFields();
    //--> ["p", "m"]
    
    o.privateFields();
    //--> ["__p"]
    
    o.keys();
    //--> ["p", "__p", "fn", "__fn"]
    
    o.allKeys();
    //--> ["p", "__p", "fn", "__fn", "m"]
    
    o.proto();
    //--> Object {}
    
    o.protoLink();
    //--> [Object {}]
    
    o.creator();
    //--> Object()
    
  11. utilies and more

    • 遍历 $every, $everyKey, $trace

    • 对象操作 $copy, $merge, $slice, $property

    • 对象工厂 $enum, $array, $fn

    • 对象反射 $traceProto, $callBase

    • 实用方法 $isPrivate, $keys, $thisFn, $containsAll

 

分享到:
评论

相关推荐

    oojs:面向对象 javascript 库的强大功能

    OOjs 是一个用于处理对象的 JavaScript 库。 主要功能包括继承、mixin 和用于处理对象的实用程序。 /* Example */ ( function ( oo ) { function Animal ( ) { } function Magic ( ) { } function Unicorn ( )...

    JavaScript面向对象编程指南(第2版)

    他还运营着其他一些网站,其中包括JSPatterns.com—一个用于探讨JavaScript模式的网站。, 3.本书内容较为简单,初学者容易上手。, 内容提要, JavaScript语言是一种具有高度表达能力的、基于原型特性的、非常灵活的...

    OO4O简介以及其在VC++中的应用

    ### OO4O简介及其在VC++中的应用 #### 摘要 OO4O(Oracle Objects for OLE)是Oracle公司推出的一种高级底层接口,专为基于Oracle...对于需要开发高性能Oracle数据库应用的开发者来说,OO4O无疑是一个很好的选择。

    oojs:面向对象的javascript库的功能。 这是https的镜像

    OOjs是一个用于处理对象JavaScript库。 关键功能包括继承,mixin和用于处理对象的实用程序。 /* Example */ function Animal ( ) { } function Magic ( ) { } function Unicorn ( ) { Animal . call ( this ) ; ...

    object-oriented-javascript

    JavaScript 使用原型链来实现继承,每个对象都有一个指向其原型对象的内部链接。通过修改这个原型链,可以实现继承。 - **多态性**:多态性是指允许子对象以自己的方式实现父对象的方法。在 JavaScript 中,由于其...

    WebGis-典型的jsoo架构项目,吐血奉献

    "WebGis-典型的jsoo架构项目"标题表明这是一个以JavaScript Object-Oriented(JSOO)架构为基础的WebGIS开发实例,对于理解WebGIS的实现机制和JSOO架构的应用具有重要意义。 JSOO是JavaScript中面向对象编程的一种...

    【JavaScript源代码】JavaScript实现简单的轮播图效果.docx

    JavaScript 实现简单的轮播图效果主要涉及以下几个关键知识点: ...通过以上步骤,我们可以实现一个基本的JavaScript轮播图效果。不过,实际项目中,可能还需要考虑触摸事件支持、响应式设计、键盘导航等更高级的功能。

    oo.js:另一个面向对象的JS库

    另一个面向对象的JS库。 JavaScript中的面向对象设计的这种实现是一个实验,因此尚不用于生产用途。 oo.js的基本目标是允许包和类的访问/构造更类似于“经典”的OO结构。 这意味着类和包是在隔离的范围内创建的,...

    oo_practice_javascript

    "oo_practice_javascript-master"这个文件名暗示这是一个源代码仓库的主分支,很可能来自Git版本控制系统。在这种结构下,开发者可以追踪代码的修改历史,协作开发,并方便地回溯到任何之前的版本。 在JavaScript的...

    【JavaScript源代码】JavaScript实现一个输入框组件.docx

    在Taro H5环境中,由于Taro组件库和Taro-ui库并未提供某些特定样式的组件,比如一个特定样式的输入框,这时就需要我们手动创建一个自定义的输入框组件。本文将详细介绍如何使用JavaScript实现这样一个组件。 首先,...

    Oriented.JavaScript.Create.scalable.reusable.high-quality.JavaScript

    - **原型链**:每个JavaScript对象都有一个`__proto__`属性,指向其构造函数的`prototype`属性。通过这种链接,可以创建对象层次结构,实现继承。 - **构造函数**:构造函数是一种特殊的函数,用于创建具有特定属性...

    javascript 树形菜单

    在JavaScript中,我们可以使用数组或对象来存储菜单的数据结构,每个节点代表一个菜单项,包含文本、链接、是否展开等属性。`Tree.js`可能包含了初始化菜单、展开/折叠菜单项、以及处理用户交互的函数。而`Tool.js`...

    资 料OOCSS

    例如,`velocity-download`可能是一个与文件下载相关的模块,它遵循OOCSS原则,可能包含结构类(如`.download-grid`)和表现类(如`.download-button`),以及状态类(如`.is-active`或`.is-hover`)。 总的来说,...

    【JavaScript源代码】如何使用gpu.js改善JavaScript的性能.docx

    **GPU.js**是一个专为Web和Node.js环境设计的JavaScript加速库。它的核心理念是利用GPU的强大并行处理能力来执行那些原本可能由CPU负责的复杂计算任务。通过这种方式,不仅能够显著提高计算效率,还能够释放CPU资源...

    JavaScriptix - OO Javascript Repository-开源

    JavaScriptix 是一个面向对象(OO)的 JavaScript 代码仓库,旨在通过开源的形式为开发者提供一组用 JavaScript 编写的类库。这些类库充分利用了 JavaScript 的面向对象特性,以.js 文件形式存储,方便开发者导入和...

    【JavaScript源代码】如何创建自己的第一个React 页面.docx

    React是一个由Facebook开发的JavaScript库,主要用于构建用户界面。不同于传统的JavaScript库,React提供了一种声明式的编程方式,使得开发者能更直观地描述UI应该如何呈现。React的核心理念是数据驱动视图,当数据...

    pizza:比萨店 Javascript OO 评估

    描述:一个模拟比萨网站,允许用户订购大/普通奶酪/意大利辣香肠比萨 说明:下载存储库并在支持 Javascript 的浏览器中运行pizza.html 权限、许可证等: 特此授予任何人免费获得本软件和相关文档文件(“软件”)...

    【JavaScript源代码】在JavaScript中如何使用宏详解.docx

    一个简单的JavaScript宏示例是`preval.macro`,它允许我们在编译时执行代码。以下是一个例子: ```javascript import preval from 'preval.macro' const one = preval`module.exports = 1 + 2 - 1 - 1` ``` 这段...

    【JavaScript源代码】javascript实现下拉菜单效果.docx

    JavaScript 部分使用了 `querySelector` 方法获取了页面上的第一个按钮和 `.show1` 元素。`var flag=0` 定义了一个布尔变量,用于判断下拉菜单是否展开。`btn.onclick` 监听按钮的点击事件,当点击时,根据 `flag` ...

    jsoo-iothub:IoT 中心库使用 Javascript 编写脚本。 此存储库包含使用 js_of_ocaml (jsoo) 编译器在 Ocaml 中创建的 IoT 中心库

    此存储库包含使用 js_of_ocaml (jsoo) 编译器在 Ocaml 中创建的 IoT 中心组件 组件分为三种: 应用 插件 服务 作者 朱利安·米诺 执照 版权所有 2015 赫尔辛基大学 根据 Apache 许可,版本 2.0(“许可”)获得...

Global site tag (gtag.js) - Google Analytics