加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 扩展AS3的数组访问运算符以“包装”超出范围的索引值

发布时间:2020-12-15 19:48:26 所属栏目:百科 来源:网络整理
导读:我真的希望能够使Flash的数组访问语法“包裹”在数组的边界上. 冗长的解释 – var array:Array = ['a','b','c','d','e','f']; 为简单起见,第一个索引为0,其值为第一个字母“a”.要获得这个价值,我们会这样做 – array[0]; // returns 'a' 只要您用于访问数组
我真的希望能够使Flash的数组访问语法“包裹”在数组的边界上.

冗长的解释 –

var array:Array = ['a','b','c','d','e','f'];

为简单起见,第一个索引为0,其值为第一个字母“a”.要获得这个价值,我们会这样做 –

array[0]; // returns 'a'

只要您用于访问数组的索引介于0和array.length之间(在我们的示例中为6),一切正常 – 但如果您使用这些边界之外的索引,则会关闭.

array[-3];
array[9]; // both return 'undefined'

有时候这是一件好事 – 有时候你会发生这种情况,而你却很好.其他时候,你发现自己希望(或者至少我发现自己希望)它表现得更像这样 –

array[-3];
array[9]; // both return 'd'

(例如,当您点击最后一张照片上的“下一张”时,照片库会跳回到开头)

有一小部分代码我一遍又一遍地使用这些东西,但是在将索引传递给数组之前总是要改变它:

var index = -3;
while(index < 0){index += array.length}
array[index % array.length]; // returns 'd'

…这很好,但我真正想做的是扩展Array对象本身,以便它自动“包装”超出范围的索引值.

TL; DR – 通过扩展Flash AS3的Array对象可以实现索引包装吗?

解决方法

查看代理类: http://livedocs.adobe.com/flex/2/langref/flash/utils/Proxy.html.

我自己没有用它,但它似乎可以完成这项工作.我修改了文档中的示例代码,它以您想要的方式工作.但是,我还没有对它进行彻底的测试,你可能想要这样做.就个人而言,我不会扩展数组,只是使用2种方法添加/检索一个简单的类,因为代理的想法似乎对我有点牵连.但那就是我.

package
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    dynamic class ProxyArray extends Proxy {
        private var _item:Array;

        public function ProxyArray() {
            _item = new Array();
        }

        override flash_proxy function callProperty(methodName:*,... args):* {
            var res:*;
            res = _item[methodName].apply(_item,args);
            return res;
        }

        override flash_proxy function getProperty(name:*):* {
            if(!isNaN(name)) {
                var index:int = name;
                while(index < 0) {
                    index += this.length;

                }
                return _item[index % this.length];
            }


            return _item[name];
        }

        override flash_proxy function setProperty(name:*,value:*):void {
            _item[name] = value;
        }
    }
}

使用:

var a:ProxyArray = new ProxyArray();
        // you can't use this syntax ['a','c'],since it would return an Array object
        a.push("a");
        a.push("b");
        a.push("c");
        a.push("d");
        a.push("e");
        a.push("f");

        trace(a[-3]);
        trace(a[9]);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读