首页 教程 API文档

创建模型

2015-09-11 16:03:25

属性


前置知识 Std.module
复杂程度 中低
使用频率 中低
成员类型 静态模块

描述


Std.model方法用于创建一个可以被Std.module和Std.ui.module以及Std.plugin.module使用的模型.

模型的配置方法与模块完全相同,当一个模块载入一个模型之后,立即拥有了模型的所有配置,当模块定义一个方法的时候,如果模型中存在相同的方法,那么这个方法将优先采用模块定义的.

如果在多个模块中存在相同功能的成员时,或者拥有相同的参数选项等的情况下,建议创建一个模型,然后在创建模块时分别使用这些模型,这能很大程度的增强代码的复用性以及可维护性.

语法


获取模型


Object Std.model(String name);
        

创建模型


Object Std.model(Object config);
Object Std.model(String name,Object config);
        

参数


名称 类型 描述
name String 模型的名称
config Object 模型的配置,一个包含配置的Object对象,如果该参数是一个函数,那么这个函数的返回值必须是一个Object,因为这个函数会被立即执行,并且将返回值作为配置.

模型配置


名称 类型 默认值 描述
type Number 0 该参数只有一个取值,0和1,当该参数为1的时候,那么直接执行模块方法的本身即可创建并返回其实例对象,而无需使用new关键字来创建.
parent Std Module Object null 父模块,指定需要继承的模块,当模块继承于父模块的时候,会自动有了父模块的所有静态成员,公有成员,受保护的成员,私有成员,选项,主函数方法,等所有特征.
mix Array,Object,Function null 指定需要混合到当前模块的一个对象,或者一个函数,该对象或者函数的所有静态方法,原型方法都将会被混合到当前模块中,如果需要混合多个对象,那么把需要混合的对象放入一个数组即可.
model String,Object,Array null

该选项指定模块需要引用的模型,如果该值是一个字符串,那么模块会自动根据字符串作为名称得到已经定义的模型(多个名称可以用空格分开)

如果这个值可以是一个对象,表示这个是一个模型的对象.

或者也可以是包含多个模型的数组,在通常情况下都使用模型名称作为值传递.

option Object null

option用于配置模块的默认参数选项,当指定了该配置之后,模块上会自动增加一个静态方法 "opts",与公有成员方法 "opt","init_opts","call_opts"

这些方法用于管理模块的参数选项.

static Object null 定义模块所包含的静态成员,这是一个静态成员名称与值对应的Object对象,模块静态成员无需创建模块实例即可被使用,例如 module1.member1();
public Object null 定义模块所包含的公有成员,这是一个公有成员名称与值对应的Object对象,使用公有模块成员的时候必须创建模块实例,公有成员可以在模块实例的内部以及外部被使用.
protected Object null

定义模块的受保护成员,一个成员名称与值对应的Object对象,受保护的成员无法被枚举, 当模块被继承的时候,受保护的成员也无法被覆盖重写,也无法被扩展.

受保护的成员仍然可以在模块实例外部被访问.

private Object null

定义模块的私有成员,一个成员名称与值对应的Object对象,私有成员被定义之后,其名称前面会自动被加上下划线 "_", 私有成员无法被枚举.

私有成员仍然可以在模块实例的外部被访问,也可以被继承.

extend Object null

如果指定了父模块,也就是如果这个模块是从另一个模块下继承的,extend中包含的函数的作用就是对现有父模块下的函数进行扩展.

如果父模块下的函数在执行时候返回了一个值,而这个值不是undefined或者this对象的时候,那么扩展的这个函数将不会被执行.

被扩展的函数如果没有返回值,那么将会返回this对象.

main Function null 模块的主函数,用于模块以函数方式被直接执行或者实例对象入口函数,例如 module1() , new module1();
entrance Function null 模块入口,当创建模块时候额外需要执行的函数,这与main方法不同,该方法仅仅用于模块创建完毕之后的执行,并且是一次性的, 通常情况下,该入口用于执行一些特殊的更原始的配置,该方法包含2个参数,第一个是模块对象的入口(main),第二个是模块的原型对象.
__constructor__ Function null 如果加入了该选项,那么将会直接替代main选项作为模块的入口函数,通常情况下,不建议加入该选项,除非你非常清楚的知道StdJS模块内部是如何运作的.

option选项增加的默认方法


静态方法 opts

该方法用于设置模块选项中的默认值,当没有传递任何参数的时候,该方法将会返回一个Std.options实例对象.


Object opts();
void opts(Object option);
        
类型 描述
Object 一个包含名称与值对应的Object对象,这些值将会覆盖默认的选项值

原型方法 opt

原型方法opt用于获取或者设置模块实例中选项的默认值.


(Any) opt(String name);
Object opt(String name,(Any) value);
Object opt(String name,(Any) value,Function callback);
        
名称 类型 描述
name String 要设置或者要获取的选项名称
value Any 需要设置的值
callback Function 在设置完值的之后需要执行的回调函数.

原型方法 init_opts

init_opts方法用于初始化模块实例的参数选项,该方法只能被执行一次.

当参数选项被初始化之后,将会自动增加一个成员变量 "opts" ,该变量保存的是当前实例对象参数选项,同时该值将会作为init_opts的返回值返回.


Object init_opts(Object option);
        
类型 描述
Object 需要设置的参数选项,这些值将会覆盖默认值.

原型方法call_opts

该方法用于执行与参数选项名称相同的成员函数,并且将参数选项对应的值作为参数.返回this对象.


//直接执行指定名称的成员函数,将该名称的选项值作为参数
Object call_opts(String name);
        

//判断指定名称的默认选项值是否与当前选项值相同,如果相同则执行指定名称的成员函数,当前选项值作为参数
Object call_opts(String name,Boolean check);
        

//执行多个指定名称的成员函数
Object call_opts(Array names);
        

//判断指定数组中名称的默认选项值是否与当前选项值相同,如果相同则执行指定名称的成员函数,当前选项值作为参数
Object call_opts(Array names,Boolean check);
        

//执行名称为options键名的成员函数,将其键值作为参数
Object call_opts(Object options);
        

//检查options中的键值如果键值与对应键名的选项值不同,则指定这个键名的成员函数,这个键值作为参数
Object call_opts(Object options,Boolean check);
        
名称 类型 描述
name String 选项名称
names Array 包含多个选项名称的数组
check Boolean 如果进行选项值的检查
options Object 名称与选项值对应的Object对象

返回值


模型本身,通常情况下该返回值作用毫无意义.

相关例子



/*
 * 创建一个模型 : "model1"
*/
Std.model("model1",{
    public:{
        func1:function(){
            console.log("func1")
        },
        func2:function(){
            console.log("func2");
        }
    },
    main:function(){
        console.log("model main");
    }
});
/*
 * 创建一个模块,引用模型 : "model1"
*/
var module1 = Std.module({
    model:"model1",
    public:{
        func3:function(){
            console.log("func3");
        }
    },
    //模型中的main方法将会被覆盖
    main:function(){
        console.log("module main");
    }
});
/*
 * 创建一个模块,继承 module1
*/
var module2 = Std.module({
    parent:module1,
    extend:{
        /*
         * 扩展func3
        */
        func3:function(){
            console.log("hello");
        }
    },
    public:{
        /*
         * 重写 func2
        */
        func2:function(){
            console.log("3.1415926");
        }
    }
});

//创建模块实例,输出 "module main"
var instance1 = new module2();
//执行成员函数func1,输出 "func1"
instance1.func1();
//执行成员函数func2,输出 "3.1415926"
instance1.func2();
//执行成员函数func3,输出 "func3" "hello"
instance1.func3();