此项目已更名为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:
-
keyword method
zero提供一系列的以$为前缀的类关键字方法,如$class,$module,$interface…
-
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(); //... })
-
module
//此关键字并不对传入的模块声明作任何处理,因此符合模块接口的普通对象也可认作是模块 function $module(o){ return o; } //使用$module声明一个模块, var MAmodule = $module({ onIncluded: function(){ this.prop1 = {}; //this为包含此模块的对象 }, prop: {}, method: function(){} }); $(obj).include(MAmodule);
-
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);
-
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();
-
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); //复合判断
-
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); //判断一个对象是否支持某接口
-
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: {} });
-
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); }
-
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()
-
utilies and more
-
遍历 $every, $everyKey, $trace
-
对象操作 $copy, $merge, $slice, $property
-
对象工厂 $enum, $array, $fn
-
对象反射 $traceProto, $callBase
-
实用方法 $isPrivate, $keys, $thisFn, $containsAll
-
相关推荐
OOjs 是一个用于处理对象的 JavaScript 库。 主要功能包括继承、mixin 和用于处理对象的实用程序。 /* Example */ ( function ( oo ) { function Animal ( ) { } function Magic ( ) { } function Unicorn ( )...
他还运营着其他一些网站,其中包括JSPatterns.com—一个用于探讨JavaScript模式的网站。, 3.本书内容较为简单,初学者容易上手。, 内容提要, JavaScript语言是一种具有高度表达能力的、基于原型特性的、非常灵活的...
OOjs是一个用于处理对象JavaScript库。 关键功能包括继承,mixin和用于处理对象的实用程序。 /* Example */ function Animal ( ) { } function Magic ( ) { } function Unicorn ( ) { Animal . call ( this ) ; ...
另一个面向对象的JS库。 JavaScript中的面向对象设计的这种实现是一个实验,因此尚不用于生产用途。 oo.js的基本目标是允许包和类的访问/构造更类似于“经典”的OO结构。 这意味着类和包是在隔离的范围内创建的,...
描述:一个模拟比萨网站,允许用户订购大/普通奶酪/意大利辣香肠比萨 说明:下载存储库并在支持 Javascript 的浏览器中运行pizza.html 权限、许可证等: 特此授予任何人免费获得本软件和相关文档文件(“软件”)...
如何创建自己的第一个React 页面 目录 Rract是啥?背景 React脚手架JSX是什么 Rract是啥? 背景 React脚手架 JSX是什么 JSX是什么 Rract是啥? React 是用于构建用户界面的 JavaScript 库 构建用户界面....
首先简单介绍一下,ECharts是一个纯JavaScript图表库,底层依赖于轻量级的Canvas类库ZRender,基于BSD开原协议,是一款非常优秀的可视化前端框架。 官网地址:http://echarts.baidu.com/ 1.首先在官网 选择...
如何使用gpu.js改善JavaScript的性能 你是否曾经尝试过运行复杂的计算,却发现它需要花费很长时间,并且拖慢了你的进程?... GPU.js 是一个针对 Web 和 Node.js 构建的 JavaScript 加速库,用于
此存储库包含使用 js_of_ocaml (jsoo) 编译器在 Ocaml 中创建的 IoT 中心组件 组件分为三种: 应用 插件 服务 作者 朱利安·米诺 执照 版权所有 2015 赫尔辛基大学 根据 Apache 许可,版本 2.0(“许可”)获得...
由于能够简化复杂的操作,闭包在主流JavaScript库以及高水平产品代码中日益流行起来。 一、变量的作用域 在介绍闭包之前,我们先理解JavaScript的变量作用域。变量的作用域分为两种:全局变量和局部变量。 var n ...
OO.js 一些简单的帮助器方法可帮助您执行面向对象的... 一旦想到一个更好的名字,我就可以将其打包发布。 用法示例 var Parent = ( function ( ) { function Parent ( foo ) { this . foo = foo ; this .
JavaScript的两个Struts的示例:原型OO-对象组成 相关链接 课程和网络广播 要在Q&A中对这些示例进行深入的视频讨论,请观看的 。 语法底漆+示例 。 。 参考 原型OO 函数式编程 四人帮的 。 是Martin Fowler,...
除了提供漂亮的 OO 界面来创建图表外,它还通过添加诸如“粘滞键”之类的有用工具来扩展功能###Sticky Keys 粘滞键是一种配置选项,允许您始终对某些键使用相同的颜色。 例如,在绘制苹果与橙子的图表时,您可能...
angularJS实现表格部分列展开缩起示例代码 AngularJS 简介 ...它是一个以 JavaScript 编写的库。 AngularJS 是以一个 JavaScript 文件形式发布的,可通过 script 标签添加到网页中: <script src="htt
BoilerplateJS是您自己的启动代码,可以启动您的下一个大型javascript产品。 仅仅是我们做了一些基本的编码和库集成,使您的生活变得轻松! 执照 BoilerplateJS代码对于商业和非商业部署和分发都是免费的。 ...
最近闲来无事,捣鼓捣鼓CSS 发现了一个比较好动画库,就是TweenMax 用起来略微有点麻烦,但是效果确实可以。 首先在angular中使用TweenMax就得先通过npm 安装 1. npm install --save-dev gsap 2. npm ...
vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合,另外一个方面,当vue与现代化的工具链以及各种支持类库结合使用时,vue也完全能够为复杂的单页应用提供驱动。 vue.js是用于构建交互式的...
React 是一个开源 JavaScript 库,开发人员使用它来创建基于 Web 和移动的应用程序,并且支持构建交互式用户界面和 UI 组件。React 是由 Facebook 软件工程师 Jordan Walke 创建,React 的第一个版本在七年前问世...
MapEasy以Google Map的方式实现了基本的GIS功能和简单...虽然是完全运用弱类型语言JavaScript编写,但良好的OO设计和模式的运用丝毫没有影响她的完美表现(JavaScript中的OO和模式现在越来越受到重视也是一个趋势)。
ExtendableClass 是一个库,它添加到 javascript 语言面向对象的功能,例如公共和受保护的方法和属性,并使其与真正的继承一起工作。 如今,ExtendableClass 已测试支持: 构造函数。 公共方法和属性。 受保护的...