发新话题
打印

[编程] 编译一个netstream类,Delegate的解决方法

编译一个netstream类,Delegate的解决方法

正常情况下是这样
ns.onStatus =function(obj){

}

但是as2.0不允许function内部去沟通外部数据

所以我用ns.onStatus=Delegate.create(this,new_link)

但是这样无法把function内部要接口的obj数据传输到new_link里面,很头痛,请高手中的高手解决

[已解决]

使用方法
复制内容到剪贴板
代码:
激活函数=Delegate.create(this,func,{x:100})
function func(obj){
    obj[0]
    //激活函数传递回来的值
    obj.x
    //自定义传回来的值
}

Delegate文件
复制内容到剪贴板
代码:
class Delegate extends Object {
private var func:Function;
function Delegate(f:Function) {
  func = f;
}
static function create(obj:Object, func:Function, argument:Object):Function {
  var f = function () {
   var target = arguments.callee.target;
   var funct = arguments.callee.func;
   if (argument == null) {
    argument = new Object();
   }
   for (var i = 0; i<arguments.length; i++) {
    argument[i] = arguments[i];
   }
   return funct.call(target, argument);
  };
  f.target = obj;
  f.func = func;
  return f;
}
function createDelegate(obj:Object):Function {
  return create(obj, func);
}
}
[ 本帖最后由 zszen 于 2007-6-25 13:16 编辑 ]
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

还有啊 在类里面写下面这个代码根本没有反映....
ns.onMetaData = function(obj) {
                        trace(obj);
                };
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

第一种方法是:
可以把new_link定义成类的静态方法,那么就可以
//------------------------
ns.onStatus =function(obj){
类.new_link(obj)

}
//-------------------------

第二种方法:
我们将Delegate类进行重新定义,让它能够传递参数的功能:
//-----------------------------------------------
class Delegate2 extends Object
{
        static function create(obj:Object, func:Function,b:Object):Function
        {
                var f = function()
                {
                        var target = arguments.callee.target;
                        var func = arguments.callee.func;
                        var b=arguments.callee.b;
                        return func.apply(target, b);
                };

                f.target = obj;
                f.func = func;
                f.b=b;
                return f;
        }

        function Delegate(f:Function)
        {
                func = f;
        }

        private var func:Function;

        function createDelegate(obj:Object):Function
        {
                return create(obj, func);
        }
}
//---------------------------------------------------
寻觅终生伴侣!

my blog

TOP

我已经清楚了,在我最早的时候,我重定义了Delegate,自从这时开始就不能传递原函数所能提供的数据了,之后我又在我的Delegate基础上改进了一下,就ok了
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

我把create里面的函数变了,当激活调用函数的时候会返回得到返回值obj.arguments这个对象,这个对象就是原函数的响应值
最终是这样
        static function create(obj:Object, func:Function, argument:Object):Function {
                var f = function () {
                        var target = arguments.callee.target;
                        var func = arguments.callee.func;
                        if (argument == null) {
                                argument = new Object();
                                argument.arguments = new Array();
                        }
                        for (var i = 0; i<arguments.length; i++) {
                                argument.arguments = new Object();
                                for (var name in arguments) {
                                        argument.arguments[name] = arguments[name];
                                }
                        }
                        return func.call(target, argument);
                        //return func.apply(target, arguments);
                };
                f.target = obj;
                f.func = func;
                return f;
        }
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

再简化一点,直接等就得了

static function create(obj:Object, func:Function, argument:Object):Function {
                var f = function () {
                        var target = arguments.callee.target;
                        var func = arguments.callee.func;
                        if (argument == null) {
                                argument = new Object();
                                argument.arguments = new Array();
                        }
                        for (var i = 0; i<arguments.length; i++) {
                                argument.arguments = arguments;
                        }
                        return func.call(target, argument);
                        //return func.apply(target, arguments);
                };
                f.target = obj;
                f.func = func;
                return f;
        }
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

解决了……
以爱你的方式活着,
录在别人的眼中,却无法被你看到。
此时此刻,你无论如何也无法理解我孤独的含义!

                                               ——冷的像风
欢迎你来我这里做客

TOP

等你等的好辛苦,,呵呵
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

//delegate (指向层级对象, 替代的函数,参数1,参数2,参数3......)
function delegate(obj:Object, func:Function):Function {
  var myArray:Array = new Array();
  myArray = arguments;
  myArray.shift();
  myArray.shift();
  var f = function () {
   var target = arguments.callee.target;
   var func = arguments.callee.func;
   if (myArray.length>0) {
    return func.apply(target, myArray);
   } else {
    return func.apply(target);
   }
  };
  f.target = obj;
  f.func = func;
  return f;
}

arguments对象可直接分散数据到其他函数中,直接这样写就行了。
我的小站:
http://www.D-eden.eb.cn

TOP

复制内容到剪贴板
代码:
class com.ycccc.utils.JDelegate {
        public static function create(obj:Object, f:Function) {
                var _arg = arguments;
                _arg.shift();
                _arg.shift();
                var _f = function () {
                        f.apply(obj, _arg);
                };
                return _f;
        }
}
这样就行了
寻觅终生伴侣!

my blog

TOP

你的这个用法 调用的时候传给func的还是obj吧
譬如Delegate.create(xx,func,par1,par2,par3....)
function func(obj){
obj[0],pbj[1],obj[2]....
}
54371309[请发送:flash8会员问题]
正在更新中..070815   http://zszen.com

TOP

参数也都传递了
寻觅终生伴侣!

my blog

TOP

发新话题