AS3创建对象数组

vic*_*ugo 3 flash object actionscript-3

我想在舞台上添加一堆汽车,并将它们作为对象存储在一个数组中.问题是我讨厌使用外部AS文件,并希望尽可能简单.

我试过做:

var car:Object = {carcolor:String,carscale:Number,carpower:Number};
var test:Array = new Array()
for (var i:Number=0; i<10; i++) {
    test.push(car)
}
Run Code Online (Sandbox Code Playgroud)

问题是如果我尝试设置一个对象的值 test[1].carscale = 5

数组中的每个对象都将其属性carcale设置为5.

有没有办法在不使用外部类文件的情况下做到这一点?

Pra*_*adi 11

虽然你应该使用外部AS文件(这是一个很好的做法),这就是你遇到问题的原因,我将逐行解释

var car:Object = {carcolor:String,carscale:Number,carpower:Number};
//This creates an object called car. Suppose it saves it in memory at "location" 0x12345

var test:Array = new Array();
//This creates an empty array

for (var i:Number=0; i<10; i++) {
    test.push(car);
    //This adds the object "car" to the array
    //Since Object is a reference type, its memory location is actually added to the array
    //This means you added 0x12345 to the array (10 times over the loop)
}

//The array now contains 
[0x12345, 0x12345, 0x12345, .......];

//So now
test[1]; //returns the object at 0x12345

test[1].carscale=5;  //sets the carscale property of the object at 0x12345
Run Code Online (Sandbox Code Playgroud)

由于数组中的所有对象都指向同一位置,因此获取它们中的任何对象实际上都会返回相同的对象.这意味着所有这些都将显示carscale为5

解决方法是:

var test:Array = new Array();
for (var i:Number=0; i<10; i++) {
    var car:Object = {carcolor:String,carscale:Number,carpower:Number};
    test.push(car);
}
Run Code Online (Sandbox Code Playgroud)

一个更好的,真实的面向对象的解决方案是创建一个名为Car的类,然后而不是做

var car:Object = {carcolor:String,carscale:Number,carpower:Number};
Run Code Online (Sandbox Code Playgroud)

你用

var car:Car = new Car();
Run Code Online (Sandbox Code Playgroud)

这个Car.as课将是这样的:

public class Car {
    public function Car() {
        //this is the constructor, initialize the object here
        //Suppose the default values of the car are as follows:
        carcolor="red";
        carscale=5;
        carpower=1000;
    }

    public var carcolor:String;
    public var carscale:Number, carpower:Number;
}
Run Code Online (Sandbox Code Playgroud)

实际上,您甚至可以使用另一个基于参数自动设置属性的构造函数:

    public function Car(_color:String, _scale:Number, _power:Number) {
        carcolor=_color;
        carscale=_scale;
        carpower=_power;
    }
Run Code Online (Sandbox Code Playgroud)

并称之为

var car:Car=new Car("red", 5, 1000);
Run Code Online (Sandbox Code Playgroud)

事实上,在car之前carcolor,carscale并且carpower因为很显然,当你把它们放在一个名为类甚至没有必要Car.