最近开发了一个JavaScript的增强型语言,大概思路就是做一个类似coffeeScript和typeScript那样js的超集,然后编译成js执行。
大家可以在这里找到项目相关的信息: www.f-script.org
快去github上给我小星星啊: https://github.com/f-script
什么是f-script
f-script的开发有这样几个宗旨,一个是统合前端后端包的import和export。二是为JS添加更多特性,让其更加能够适应后端开发。让JS变成一个前后端通用且好用的语言。
目前添加了的特性
包管理
对于前后端不同的包标准,可以通过use 语句来定义。尽管包标准不同,但是提供统一的import export, 在编译的时候把其编译成适合标准的import和export
use "umd"; // can also be 'cmd', 'amd', if no use statement, the default standard will be 'umd'
import "foo/bar","aaa/bbb";
import "abc" as a,"foo1" as b;
import "foo", "foo2" as c;
function hello(){}
function world(){}
function test(){}
export hello as h,world as w,test;
use “amd”; 就会编译成适合requirejs使用的包。
use “cmd”; / use “commonjs”; 就会编译成适合nodejs 使用的包。
use “umd”; 就会编译成既能在requirejs环境下又可以在nodejs环境下使用的包,并且会向无requirejs的浏览器环境下导出一个与文件名一样的全局变量。
类和元类
类的写法:
class A{
//public
this.a =1;
this.b =2;
this.foo = function(){};
//private
var c = 3;
var foo = function(){
//call public
this.foo();
};
//static
A.d = 4;
A.foo = function(){};
//constructor
this.A = function(a,b){
this.a = a;
this.b = b;
};
}
基本实现原理:把class body 变成一个函数,生成一个空对象,把这个classbody函数通过apply把this指针绑定到这个空对象上。
类的继承写法:
目前还不能支持多重继承,虽然语法上支持了。。。
class B extends A{
this.d = 1;
}
// 也可以像python那么写
class B(A){}
元类的写法
我承认,元类基本上照抄了python的那一套。
//继承内置函数CLASS就会让一个类变成元类
class AMeta(fscript.CLASS){
//元类使用__new__ 方法来创建类,我们重写这个方法
this.__new__=function(classname,baseclass,attrFunc){
/*
__new__ funcion 有三个参数
classname: 要创建的类名
baseclass:继承的类对象
attrFunc: 构造对象属性的函数
*/
//我们把构造对象属性的函数换个新的
attrFunc = function(){
this.hello = "world";
}
//然后用这个新的函数构造一个类。
return new fscript.CLASS(classname,baseclass,attrFunc);
/*在新函数里也可以call老的函数,不过需要通过apply来绑定this指针
var attr=function(){
this.hello = "world";
attrFunc.apply(this);
}
*/
}
}
//把这个元类给A, 那么A就是由AMeta创建的了
class A meta AMeta{}
var a = new A();
//元类会被B继承
class B extends A{}
var b = new B();
console.log(a.hello); //world
console.log(b.hello); //world
有了元类,就能实现一些magic啦。
多行字符串
var a = """
我是多行字符串,
就像python里的一样。
哦呵呵。
""";
计划中的特性
- 类型判断,是时候终结js中坑爹的类型判断了。
- 回调的语法糖。这个还没有想好要怎么样才能更好写,或者内置一个promise defer 库?
- 装饰器模式 @xxxx function xxxxx(){}
- 更自由的参数列表,准备参考python的方式
大家来一起讨论讨论吧。