Selectors、Attributes、Data

Selectors

如果调用时不带任何参数,则返回当前的状态。如果有string参数, selector 会查询并返回匹配的 State

var o = {};
state( o, {
    A: {
        AA: state( 'initial', {
            AAA: state
        }),
        AB: state
    },
    B: state
});

o.state();            // >>> State 'AA'
o.state('');          // >>> State ''
o.state('A.AA.AAA');  // >>> State 'AAA'
o.state('.');         // >>> State 'AA'
o.state('..');        // >>> State 'A'
o.state('...');       // >>> State ''
o.state('.AAA');      // >>> State 'AAA'
o.state('..AB');      // >>> State 'AB'
o.state('...B');      // >>> State 'B'
o.state('AAA');       // >>> State 'AAA'
o.state('.*');        // >>> [ State 'AAA' ]
o.state('AAA.*');     // >>> []
o.state('*');         // >>> [ State 'A', State 'B' ]
o.state('**');        // >>> [ State 'A', State 'AA', State 'AAA',
                      //       State 'AB', State 'B' ]

State 使用了一个简单的选择格式:

  1. 状态的名称用dot(.)同他们的子状态分隔

  2. 选择器以 .开头,即被认为当前的状态,当选择器以名称开头时,即被认为从根状态的绝对路径识别。

  3. 除了为了避免歧义,一个完全限定的名称是没有必要的, 'A.B.C''C' 都在没有其他状态名为c时,将会被解释相同的c状态。

  4. 特殊情况:空字符串 '' 关联根状态; single-dot . 关联当前状态; double-dot .. 关联当前状态的父状态。

  5. 选择器以 * 结尾时,返回之前级别的直接子状态, 而 ** 所有子状态。

Selectors are similarly put to use elsewhere as well: a transition’s origin and target properties are evaluated as selectors; and several State methods, including change, is, isIn, has, isSuperstateOf, and isProtostateOf, accept a selector as their main argument.

Attributes

State expressions 可包包含空格分隔的一组 attributes, provided as a single string argument that precedes the object map within a state() call.

state( obj, 'abstract', {
    Alive: state( 'default initial mutable', {
        update: function () { /*...*/ }
    }),
    Dead: state( 'final', {
        update: function () { /*...*/ }
    })
});

expression 的 attributes 从 expression 修改 任何 State 实例,从而使用某些功能或者限制某些功能。

Mutability attributes

默认的,states 是 weakly immutable — 一旦构造完成,它们的 data, methods, guards, substates 和 transitions 不能被修改 — 可以在构造时影响可变性的 attributes 有 mutable(可变的), finite(有限的)immutable(不可变),这里按照优先级列出。

声明一个 state mutable 则允许它已经任何继承它的状态在被构造之后修改。 可以通过声明 finite 达到部分限制,即不允许添加或移除子状态。可变性最终可以通过声明 immutable 来严格控制,即不允许修改自身和继承它的状态。

任何 mutability attributes 都是隐式的从他们的祖先继承,如 superstates 或 protostates.

Abstraction attributes

State 并不局限于作为 “leaf” states。所有的 states,包括 substate,默认都为 concrete ,并且都能作为 transition 的目标。然后,有时仍需有 abstract states 来作为公共的祖先来被继承, abstraction attributes 包含 abstract, concretedefault。.

当Transitions 指向一个 abstract state 时,会被重新定向到默认的 default substate.。如没有 substate 被标记为 default,transition 会重定向到 abstract state 的第一个 substate。如果重定向的本身就是 abstract,重定向会递归直到找到 concrete 的状态。

所有的 abstraction attributes 都是从 protostates 继承,而不是从 superstates。States 可以设置 concrete attribute 来覆盖 abstract attribute。

Destination attributes

一个对象的流通必定会经常 initialized 或局限于特定的某些 states, as directed by the destination attributes initial, conclusive, and final.

conclusive attribute 限定的对象的流通,一旦进入了 conclusive state 则不能退出, though transitions that take place entirely within the conclusive state may proceed。同样的,一旦进入 final state,即不允许 transitions

所有的 abstraction attributes 都是从 protostates 继承,而不是从 superstates。

Data

data 可以随意附加到 state,并且可以通过 protostates and superstates 继承。 Data 在 state expression 的 data 中声明,可以通过 get 读取。对于 mutable states,可以通过 let 添加、 set 设置、 delete 删除。 Data 还可以通过 data 方法操控。

function Chief () {
    state( this, 'mutable', {
        Enraged: {
            Thermonuclear: {
                data: {
                    mission: 'destroy',
                    budget: Infinity
                }
            }
        }
    });
}
state( Chief.prototype, {
    data: {
        mission: 'innovate',
        budget: 10000000000
    },
    Enraged: {
        data: {
            mission: 'compete'
        }
    }
});

var mobs = new Chief;
mobs.state().data();
// >>> { mission: 'innovate', budget: 10000000000 }

mobs.state('-> Enraged');
mobs.state().data({ target: 'Moogle' });
mobs.state().data();
// >>> { target: 'Moogle', mission: 'compete', budget: 10000000000 }


mobs.state().go('Thermonuclear');
mobs.state().data();
// >>> { target: 'Moogle', mission: 'destroy', budget: Infinity }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值