用于方法的Function.call(someInstance,args)。忽略第一个arg

时间:2012-08-15 21:09:08

标签: actionscript-3 call this

在as3中,有一种灵活的方法可以在调用它时更改对象实例。 调用或应用Function对象的成员可以使用特定的第一个arg调用,并且引用说我们,这个第一个arg将是“this”指针内部的函数。但我发现它错了。

我写的小测试,如下所示。

public class Test 
{
  private var name:String = "default";
  public var test3:Function = test;
  public var test2:Function = function()
  {
    trace(this.name);
  }

  public function Test(name:String) 
  {
    this.name = name;
  }

  public function test():void
  {
    trace(this.name);
  }
}

并测试了它。

var tmp:Test = new Test("default");
tmp.test();  //out default
tmp.test.call(new Test("new"));  //out default

tmp.test2(); //out default
tmp.test2.call(new Test("new2")); //out new2

tmp.test3(); //out default
tmp.test3.call(new Test("new3")); //out default

因此,在匿名函数调用中我们可以得到正确的输出,但不是在成员函数的情况下。 也许这是因为模糊的“this”指针,应该为正确的工作提供真实的对象实例,也许是其他的。我现在不知道,并且as3引用并没有描述它的含义。

最后的问题清单:

  1. 为什么这样?通过我,这很奇怪,看起来像未定义的行为;
  2. 我如何实现这一功能?如何像匿名一样欺骗测试功能?是不是称之为方法目标?
  3. 这不是很重要,但我会很高兴得到任何好的答案。谢谢!

    P.S。对不起我的英文。

    // EDITED:将此语句添加到所有“名称”引用中。什么都没有改变。

1 个答案:

答案 0 :(得分:2)

  

调用[[Call]]属性时,行为不同   不同类型的封闭物。闭包是一个包含a的对象   引用方法,[[Call]]属性的行为不同   取决于它是函数,方法还是类闭包。一个   函数闭包是一个不是全局方法的函数闭包   与任何类的实例相关联。方法闭包包含一个   类的实例方法,并将永远记住它的原始   “这个”价值。

     

如果闭包是一个函数闭包,那么第一个参数就传递了   将[[Call]]传递给方法并用作“this”   值。如果第一个参数为null或未定义,那么全局   object将用作方法的“this”值。

     

如果闭包是一个方法闭包,那么第一个参数   [[Call]]将被忽略,并为方法保存“this”值   闭包将作为第一个参数传递给方法。一个方法   闭包记录其原始“this”值是什么并且始终使用   而不是[[Call]]的第一个参数。

     

如果闭包是一个类闭包,并且传递了1个参数   [[Call]](除了“this”参数),然后调用   作为类型转换处理,参数将被强制转换为   闭包所代表的类型。

http://learn.adobe.com/wiki/display/AVM2/2.4+Method+invocation+notes