我知道AS3没有指针或引用。每个对象都是通过引用传递的。(我以为?)如果我想对指针做些什么呢?例如,所有的对象指向一个目标,我只需要改变目标的值,然后所有其他对象将访问不同的值。
您可以通过使用helper对象来模拟指针来有效地获得相同的行为——换句话说,使用它来携带目标引用。例如:
public class PseudoPointer
{
private var obj:Object;
private var prop:String;
public function PseudoPointer(obj:Object, prop:String)
{
// Point to property with name 'prop' on object 'obj'.
this.obj = obj;
this.prop = prop;
}
public function get value():* {
return obj[prop];
}
public function set value(value:*):void {
obj[prop] = value;
}
}
然后你可以这样做——假设在一个名为target
的对象上有一个magicNumber
属性:
var numberPtr = new PseudoPointer(target, "magicNumber");
myDynamicObjectA.numberPtr = numberPtr;
myDynamicObjectB.numberPtr = numberPtr;
myDynamicObjectC.numberPtr = numberPtr;
现在任何对伪指针有引用的对象都可以读写目标属性:
numberPtr.value = 42;
你可以创建一个函数,在这个函数中你给它一个值,然后把它赋值给所有其他的变量。
如下所示:
var objectA:Number;
var objectB:Number;
...
function myFunction(newValue:Number):void
{
objectA = newValue;
objectB = newValue;
...
}
您可以尝试为函数设置一个变量引用。然后,如果你更新引用,它将返回一个不同的函数。
var myFunc:Function;
function funcOne():int {
return 1;
}
function funcTwo():int {
return 2;
}
function getFunc():Function {
return myFunc;
}
myFunc = funcOne;
var myObjOne:Object = new Object();
myObjOne.objFunc = getFunc;
var myObjTwo:Object = new Object();
myObjTwo.objFunc = getFunc;
trace(myObjOne.objFunc.call().call()); // 1
trace(myObjTwo.objFunc.call().call()); // 1
myFunc = funcTwo;
trace(myObjOne.objFunc.call().call()); // 2
trace(myObjTwo.objFunc.call().call()); // 2
这允许任何对象指向单个函数,并使其返回的结果可同时为所有函数更新。这不是最漂亮的代码,它不像ActionScript有委托来强制为myFunc设置的签名那样类型安全,但如果你有创意的话,它仍然是一个非常灵活的模型。
让这些指针指向包含该对象或将该对象作为其属性的对象。
var myArr:Array = [new YourObject()];var client1:ArrayClient = new ArrayClient();client1。array = myArr;var client2:ArrayClient = new ArrayClient();client2。
myArr[0] = new YourObject();
//client1.array [0] = = client2。数组[0]==新对象
然而,这似乎是一个伟大的方式让自己陷入很多麻烦真的很快。用例是什么?