当前位置: 代码迷 >> JavaScript >> 发布上一代的JS类体系规范(草案):Javascript Class Specification,欢迎架构师级的Js/Java Fans参与讨论
  详细解决方案

发布上一代的JS类体系规范(草案):Javascript Class Specification,欢迎架构师级的Js/Java Fans参与讨论

热度:332   发布时间:2013-02-04 10:50:22.0
发布下一代的JS类体系规范(草案):Javascript Class Specification,欢迎架构师级的Js/Java Fans参与讨论。
该规范的目标是取代目前流行的CommonJS或RequireJS。构建下一代真正完全面向对象的类体系。
该规范的第一个参考实现是JSDK1.0: https://github.com/fch415/jtdk

该规范仍在不断演进中,欢迎资深开发者提出改进建议!
该规范的全文(中文版):https://github.com/fch415/jss/blob/master/%231/jss%231_jcs_cn.md

下面是该规范的部分内容:

类的命名

    完整的类名 应该 如下:

    projectName/[packgeName/]SimpleName.js

    项目名可以全大写或全小写,包名 应该 全小写,类名的首字母 应该 大写。

    类的方法名或变量名 应该 遵循Camel命名法。常量名 应该 全大写。

    私有方法名或静态量名应该在首字母前加下划线。

类的路径

    在开发期,每一个类 应该 保存为一个文件:

    projectDir/[packgeName/]SimpleName.js

    类系统 应该 使用如下代码来定义类路径:

    JS.setPath({
        'JS': '../../source',
        'my': './test/src',
        'my.*': [
            'my.CAT',
            'my.Sleepable']
    })

类的定义

    每个类 必须 使用如下代码来定义:

    JS.define("projectName.[{packageName.]SimpleName", {
        singleton: true|false, //singleton or instance class
        requires: [..], //need load classes before definition
        extend: "", //only inherit one super class
        mixins: [..], //allow inherit many classes's prototypes
        constructor: function(){//class system must first execute super class constructor
            ...
        },
        config: {..}, //auto generate getter and setter methods
        statics: {..}, //static fields and methods
        "field_name": ..., //instance class's instance field or singleton class's static field
        "method_name": function(){..} //instance class's instance method or singleton class's static method
    })

    "JS.Object" 必须 是所有类的根父类

类的加载

    类文件可以直接同步方式加载,类文件还可以使用如下代码异步加载: javascript JS.setPath({ "projectName": "/projectDir" }); JS.imports(["projectName.[packageName.]SimpleName", ..], function(){ //console.log(this===JS.ClassLoader) //console.log(this.create("projectName.[packageName.]SimpleName", ..)) });

当未指名类加载器,类系统 应该 使用一个缺省的类加载器(JS.ClassLoader)异步加载所有类。

    也允许自定义一个类加载加载某个package,如下:
    javascript var loader = new JS.Loader({id:'loaderID',paths:{"projectName": "/projectDir"}}); JS.imports(["projectName.[packageName.]SimpleName", ..], function(){ //console.log(this===loader) //console.log(this.create("projectName.[packageName.]SimpleName", ..)) }, loader);

还有一种简写法:

    JS.imports(["projectName.[packageName.]SimpleName", ..], function(){
        ....
    }, {"projectName": "/projectDir"});//auto generate a loader with a random id

自定义的类加载器 必须 是JS.Loader的实例,如不指定父加载器,则类系统自动指定JS.ClassLoader为其父加载器。

    类加载器可以通过以下代码查找:
    javascript var loader = JS.Loader.getLoader("loaderID");

多版本类库的加载

类系统 应该 使用多ClassLoader机制来解决类库的多版本同时加载与使用的问题。 先定义两个Loader,分别加载"test"类库的两个版本:

    JS.imports(['test.CAT'], function(){
        var cat = this.create('test.CAT', ...);    
    }, {'test': '/v1/source'});

    JS.imports(['test.CAT'], function(){
        var cat = this.create('test.CAT', ...);
    }, {'test': '/v2/source'});

类实例的创建

使用以下方式创建一个类实例,前提是类文件已经加载。

    同步加载时

    JS.create("projectName.[packageName.]SimpleName", ..) ;

    异步加载时

    JS.imports(["projectName.[packageName.]SimpleName", ..], function{
        this.create("projectName.[packageName.]SimpleName", ..) ;
    });


  相关解决方案