在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引用并没有描述它的含义。
最后的问题清单:
这不是很重要,但我会很高兴得到任何好的答案。谢谢!
P.S。对不起我的英文。
// EDITED:将此语句添加到所有“名称”引用中。什么都没有改变。
答案 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