自己写的JavaScript 增强语言 f-script
发布在f-script 更容易用的JavaScript2016年2月22日view:1753开源项目编译与执行
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

最近开发了一个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的方式

大家来一起讨论讨论吧。

评论
发表评论
2年前

感谢分享!

2年前
赞了此文章!
2年前

没有什么大亮点的话会有人用么

WRITTEN BY
face
全端工程师一枚。。。
TA的新浪微博
PUBLISHED IN

我的收藏