经典面向对象
JavaScript框架

下载0.2.9
发布日期:2017年11月7日

GNU(全球导航单元)js是一个经典的面向对象JavaScript框架,旨在消除样板代码并“轻松”转换为来自其他面向对象语言的JavaScript。功能包括:

GNU ease.js是一个框架,而不是编译器。它可以用于任何JavaScript可以使用,并支持所有主要浏览器;ease.js还提供支持通过优雅地降级功能(例如可见性支持),同时保持功能一致。

该项目是GNU项目.

简单直观的类定义

类定义与Java等语言的常见语法非常相似和PHP。

const{Class}=easejs;const Stack=类(“堆栈”,{'私有堆栈':[],“公共推送”(值){这个_stack.push(值);},'公共流行'(){返回这个_stack.pop();},} );

类可以是匿名或命名后者对于调试更有用。由于课程可能匿名,构造函数是样式在之后菲律宾比索.

const Foo=类(“私有名称”:“”,建造师(姓名){这个_名称=“”+(名称);},'公开说你好'(){返回这个_name+“说‘你好!’”;},);

类可以使用或不使用新的关键字。省略简明方法链接中的辅助工具和临时实例.

const inst_a=Foo(“John Doe”);const inst_b=新Foo(“John Doe”);//临时实例Foo(“John Doe”).sayHello();
阅读手册中的更多内容

经典传承

可以扩展类以创建子类型。与C++一样,方法是默认情况下是虚拟的。在Java术语中,所有方法都是默认为final。不支持多重继承,如Java(请参见接口).

const Cow=类别(“Cow”,{'虚拟公共提示'(){return“Omph”;},} );const SturdyCow=类(“SturdyCow”)延伸(奶牛,{'覆盖公共提示'(){return“哞”;},} );

或者,如果创建匿名子类型,则超类型的扩展()方法。

const SturdyCow=Cow.extend({/*…*/});

多态方法的类型检查可以使用类.isA(),这是在中推荐地点运算符.

const cow=奶牛();const坚固=坚固牛();类别.isA(Cow,Cow);//真的类.isA(SturdyCow,cow);//等级isA(牛,结实);//真的等级.isA(坚固牛,坚固);//真的

为了防止类被扩展,最终课程可以使用。

const Foo=FinalClass('Foo',{'公共描述'(){return“无法扩展。”;},} );
阅读手册中的更多内容

混合特性

为了庆祝成为GNU,引入了特性支持项目。它目前正在开发中,尚未最终确定,但自v0.2.0以来已包含在每个GNU ease.js版本中,并且是稳定的。

const Echo=类(“Echo”,{“虚拟公共回声”(str){返回str;},} );const Prefix=属性(“前缀”)扩展(回声,{“private _prefix”:“”,__mixin(前缀){这个_prefix=''+前缀;},“public abstract override echo”(str){返回这个_前缀+this__超级(str);},} );const后缀=特征(“后缀”)扩展(回声,{“private _suffix”:“”,__mixin(后缀){这个_后缀=“”+后缀;},“public abstract override echo”(str){返回这个__超级(str)+这个_后缀;},} );const UpperCase=特征('UpperCase')扩展(回声,{“public abstract override echo”(str){返回这个__super(str).toUpperCase();}} );//可堆叠的参数化特征回声使用(前缀(“Bar”)).use(后缀(“Baz”)).use(UpperCase).use(前缀(“Foo”).use(后缀(“Quux”))().echo(“内部”);//结果:FooBARINNERBAZQuux

一些最终细节完成后,将提供文档最终确定。直到那时,这个测试案例提供了大量的例子和理由.以下职位还总结了一些功能:

访问修改函数

所有三个通用访问修改器—公共、受保护和私人服务得到支持,但仅在ECMAScript 5及更高版本中强制执行环境。

const DatabaseRecord=类('DatabaseRecord',{“private _connection”:空,构造函数(主机、用户、传递){这个_连接=此_连接(主机、用户、通道);},“private _connect”(主机、用户、密码){//(做连接工作)返回{host:host};},“受保护的查询”(查询){//对此执行查询_连接,而不是暴露//这个_与子类型的连接},“protected escapeString”(字段){返回字段.replace(“'”,“\\'”);},'公共getName'(id){返回这个_查询(“从用户中选择名称WHERE id='”+这个_escapeString(id)+“'极限1”);},} );

在上面的示例中,数据库连接仍然封装在数据库记录。子类型可以查询和转义字符串,以及外部调用者能够检索给定id的名称。正在尝试从外部访问私有成员或受保护成员将导致错误。尝试从子类型内访问私有成员将导致错误。

或者,可以使用更简洁的风格,这对JavaScript原生原型模型的用户:

const DatabaseRecord=类(“DatabaseRecord”,{/*隐式私有*/_连接:空,构造函数(主机、用户、传递){这个_连接=此_连接(主机、用户、通道);},/*隐式私有*/_连接(主机、用户、通道){//(做连接工作)返回{host:host};},“受保护的查询”(查询){//对此执行查询_连接,而不是暴露//这个_与子类型的连接},“protected escapeString”(字段){返回字段.replace(“'”,“\\'”);},/*默认为public*/获取名称(id){返回这个_查询(“从用户中选择名称WHERE id='”+这个_escapeString(id)+“'极限1”);},} );
阅读手册中的更多内容

抽象类和方法

如果类包含抽象成员,则必须将其声明为抽象类。抽象方法必须由子类型和重写隐式虚拟。

const数据库=AbstractClass(“数据库”,{“公共连接”(用户,pass){if(!(this.authenticate(user,pass)){throw Error(“身份验证失败”);}},//抽象方法将参数定义为字符串数组“abstract protected authenticate”:[“user”,“pass”],} );const MongoDB=类('MongoDB')extend(数据库,{//必须实现Database.authenticate()的每个参数“受保护的身份验证”(用户,通行证){// ...},} );
阅读手册中的更多内容

接口

js支持Java接口概念,其行为非常抽象没有实现的类。每个方法都是隐式抽象的。属性无法在接口上定义。

const Filesystem=接口(“文件系统”,{“public open”:[“path”,“mode”],“public read”:[“handle”,“length”],“public write”:[“handle”,“data”],“公共关闭”:[“句柄”],} );

具体类可以实现一个或多个接口。如果是具体类别不为上定义的每个方法提供具体实现接口,它必须声明为抽象类.

const ConcreteFilesystem=类(“ConcreteFile系统”).implement(Filesystem)//多个接口作为单独的参数{“公共打开”(路径、模式){返回{path:path,mode:mode};},“公共读取”(句柄,长度){返回“”;},“公共写入”(句柄、数据){// ...返回data.length;},“公共关闭”(句柄){// ...返回此;},} );

多态方法可以检查给定对象是否实现特定接口。

const inst=混凝土文件系统();类.isA(文件系统,安装);//真的
阅读手册中的更多内容

静态成员和常量成员

静态成员绑定到类本身,而不是特定的实例。常量是不可变的静态成员(与PHP等语言不同,他们可以使用任何访问修饰符)。为了支持两者前和后ECMAScript 5之后的环境,语法需要使用静态存取器方法-$().

const Cow=类别(“Cow”,{“固定支腿”:4,'私有静态编号':0,构造函数(){//__self指与此实例关联的类这个__自我$('_number')=此__自我$('_number')+1;},'公共静态创建'(){return Cow();},'公共静态getNumber'(){返回这个__自我$('_number');},} );奶牛$(“腿”);//4Cow.getNumber();//0奶牛创造();Cow.getNumber();//1
阅读手册中的更多内容

透明错误子类型

ECMAScript中的错误子类型(创建自己的错误类型)是臭名昭著的粗鲁,凭直觉让它发挥作用是公平的更努力。延伸错误或其子类型。

const MyError=类(“MyError”).extend(错误,{});const e=我的错误(“Foo”);电子消息;//e.name;//我的错误//--如果环境支持--e.stack;//堆栈从调用方开始e.文件名;//调用方文件名e.lineNumber;//来电号码e.column编号;//调用方列号//一般情况throw MyError('Foo');
阅读手册中的更多内容