如何设置克隆对象的属性?
How can I set properties of a clone object?
我在 this 网站上找到了一个关于克隆对象的好教程(感谢 Andrey Popov)。我修改了它,创建了一个 mc 和一个文本字段。问题是我无法为 mc 和文本字段的属性设置默认值。这是我的代码:
var getReadOnlyValues:Function = function():Object { return {
mc1: new box_1_1(),
mc1: {
name: "mc1_",
alpha: 1,
x: 0,
y: 0,
width: 30,
height: 25
},
mc1Text: new TextField(),
mc1Text: {
text: "test",
x: 100.60,
y: 80.50,
selectable: false,
multiline: false,
wordWrap: false,
defaultTextFormat: caption_tf
}
}};
function addBoxes() {
var copyOne:Object = getReadOnlyValues();
copyOne.mc1.alpha = 1;
copyOne.mc1.x = num;
copyOne.mc1.width = 200;
addChild(copyOne.mc1);
copyOne.mc1.addEventListener(MouseEvent.CLICK, onCaptionClick);
copyOne.mc1.addChild(copyOne.mc1Text);
copyOne.mc1Text.text = "test_" + num;
copyOne.mc1Text.x = num;
// traceObj(copyOne);
// traceObj(getReadOnlyValues());
}
如何为实例设置默认值?
我会把它写到评论中,但它太长了所以我开始:
您可以像这样创建空对象:
var o1:Object = new Object(); //empty object with constructor call
var o2:Object = {}; //this is an empty object with object literal
然后您可以将属性分配给对象:
o1.abc = "This is my abc string";
o1["abc"] = "This is my abc string"; //the same as above
如果您使用对象字面量创建一个对象,您可以在创建时立即分配一个 属性(这在构造函数调用中是不可能的):
var o:Object = {
prop1: "My prop",
myMc: new Movieclip()
}
我将使用您现在称为 getReadOnlyValues
的函数。此函数 returns 具有属性的对象。但是在您的情况下,您使用了 属性 名称两次:
mc1: new box_1_1(),
mc1: {
name: "mc1_",
alpha: 1,
x: 0,
y: 0,
width: 30,
height: 25
}
这是不正确的。 属性 名称必须是唯一的(因为它们基本上是字符串标识符)。另请注意,当您再次尝试 "set" mc1 时,您尝试将此 属性 分配给另一个具有对象文字( {}
)和属性的对象(!)。但就是这样,这个对象与你的 box_1_1
实例无关,它只是一个独立的对象。与文本字段相同。如果您想为不同 类 的实例设置值,则需要以其他方式进行设置,因为您不能仅将某个对象的某些值关联到您的动画片段 'out of thin air'。这是一个如何做到这一点的例子(注意这只是为了解释对象和属性的概念):
var o1 = {
mc: new MovieClip(),
mcSettings: {
x: 100,
y: 300,
alpha: 0.5
}
}
var o2:Object = {
mc: new MovieClip(),
mcSettings: {
x: 1,
y: 2,
alpha: 0.3
}
}
function setValues(o:Object):void {
var mc:MovieClip = o.mc;
var settings:Object = o.mcSettings;
for(var i:String in settings) {
mc[i] = settings[i]; //would be mc["x"] = 100, mc["y"] = 300, mc["alpha"] = 0.5 for o1
}
trace(mc.x, mc.y, mc.alpha);
}
setValues(o1);
setValues(o2);
您可以扩展 MovieClip 和 TextField,并在那里定义默认值...
package
{
import flash.display.MovieClip;
public class MyMovieClip extends MovieClip
{
public function MyMovieClip()
{
super();
x = 10;
y = 10;
name = "testName";
}
}
}
然后,当稍后创建时,这些值将在构建时定义...
var myMovie:MovieClip = new MyMovieClip as MovieClip;
我在 this 网站上找到了一个关于克隆对象的好教程(感谢 Andrey Popov)。我修改了它,创建了一个 mc 和一个文本字段。问题是我无法为 mc 和文本字段的属性设置默认值。这是我的代码:
var getReadOnlyValues:Function = function():Object { return {
mc1: new box_1_1(),
mc1: {
name: "mc1_",
alpha: 1,
x: 0,
y: 0,
width: 30,
height: 25
},
mc1Text: new TextField(),
mc1Text: {
text: "test",
x: 100.60,
y: 80.50,
selectable: false,
multiline: false,
wordWrap: false,
defaultTextFormat: caption_tf
}
}};
function addBoxes() {
var copyOne:Object = getReadOnlyValues();
copyOne.mc1.alpha = 1;
copyOne.mc1.x = num;
copyOne.mc1.width = 200;
addChild(copyOne.mc1);
copyOne.mc1.addEventListener(MouseEvent.CLICK, onCaptionClick);
copyOne.mc1.addChild(copyOne.mc1Text);
copyOne.mc1Text.text = "test_" + num;
copyOne.mc1Text.x = num;
// traceObj(copyOne);
// traceObj(getReadOnlyValues());
}
如何为实例设置默认值?
我会把它写到评论中,但它太长了所以我开始: 您可以像这样创建空对象:
var o1:Object = new Object(); //empty object with constructor call
var o2:Object = {}; //this is an empty object with object literal
然后您可以将属性分配给对象:
o1.abc = "This is my abc string";
o1["abc"] = "This is my abc string"; //the same as above
如果您使用对象字面量创建一个对象,您可以在创建时立即分配一个 属性(这在构造函数调用中是不可能的):
var o:Object = {
prop1: "My prop",
myMc: new Movieclip()
}
我将使用您现在称为 getReadOnlyValues
的函数。此函数 returns 具有属性的对象。但是在您的情况下,您使用了 属性 名称两次:
mc1: new box_1_1(),
mc1: {
name: "mc1_",
alpha: 1,
x: 0,
y: 0,
width: 30,
height: 25
}
这是不正确的。 属性 名称必须是唯一的(因为它们基本上是字符串标识符)。另请注意,当您再次尝试 "set" mc1 时,您尝试将此 属性 分配给另一个具有对象文字( {}
)和属性的对象(!)。但就是这样,这个对象与你的 box_1_1
实例无关,它只是一个独立的对象。与文本字段相同。如果您想为不同 类 的实例设置值,则需要以其他方式进行设置,因为您不能仅将某个对象的某些值关联到您的动画片段 'out of thin air'。这是一个如何做到这一点的例子(注意这只是为了解释对象和属性的概念):
var o1 = {
mc: new MovieClip(),
mcSettings: {
x: 100,
y: 300,
alpha: 0.5
}
}
var o2:Object = {
mc: new MovieClip(),
mcSettings: {
x: 1,
y: 2,
alpha: 0.3
}
}
function setValues(o:Object):void {
var mc:MovieClip = o.mc;
var settings:Object = o.mcSettings;
for(var i:String in settings) {
mc[i] = settings[i]; //would be mc["x"] = 100, mc["y"] = 300, mc["alpha"] = 0.5 for o1
}
trace(mc.x, mc.y, mc.alpha);
}
setValues(o1);
setValues(o2);
您可以扩展 MovieClip 和 TextField,并在那里定义默认值...
package
{
import flash.display.MovieClip;
public class MyMovieClip extends MovieClip
{
public function MyMovieClip()
{
super();
x = 10;
y = 10;
name = "testName";
}
}
}
然后,当稍后创建时,这些值将在构建时定义...
var myMovie:MovieClip = new MyMovieClip as MovieClip;