我有两种方法来构建我的课程,我想知道哪种方式会更正确。
选项#1是在构造函数中声明我的所有变量和函数以使它们保持本地,但问题是我的嵌套函数认为this
表示[Object Global]
而不是[Object MyObject]
。所以在构造函数中,我必须创建对象var thisObject:MyObject = this;
的引用,并在嵌套函数中使用thisObject
而不是this
。
选项#2是将所有变量和函数声明到构造函数之外和与构造函数相同的级别。这意味着我的变量是全局的,我觉得你应该尽可能地保持变量本地。此外,我的构造函数接受参数,因此我必须为每个参数创建一个重复的全局版本,以供我的全局函数使用。
哪种方式被认为是最佳做法?
选项#1
public class MyObject extends sprite {
public function MyObject(myInt:int) {
var thisObject:MyObject = this;
addEventListener(MouseEvent.CLICK,nesetedCallbackFunction);
function nestedCallbackFunction(evt:MouseEvent):void {
trace(this); //[Object Global]
trace(thisObject); //[Object MyObject]
thisObject.x += myInt;
}
}
}
选项#2
public class MyObject extends sprite {
var myIntProperty:int;
public function MyObject(myInt:int) {
myIntProperty = myInt;
addEventListener(MouseEvent.CLICK,globalCallbackFunction);
}
public function globalCallbackFunction(evt:MouseEvent):void {
this.x += myIntProperty;
}
}
答案 0 :(得分:0)
选项2更好,但要阅读构图和封装。
在选项2中,您不需要将对象的所有属性作为参数传递给构造函数。只需将变量更改为公开:
public var myIntProperty:int;
然后,当您创建对象时,您可以在必要时更新其属性:
var myObject:MyObject = new MyObject();
myObject.myIntProperty = 10;
更好的方法是封装属性,以便您可以更好地控制它可以设置的内容。例如,如果你知道你的int应该只在0-10范围内,你可以这样做:
public class MyObject extends sprite {
public function set myIntProperty(value:int):void {
if(value >= 0 && value <= 10)
_myIntProperty = value;
}
public function get myIntProperty():int {
return _myIntProperty;
}
private var _myIntProperty:int;
}
你使用的方法完全相同:
var myObject:MyObject = new MyObject();
myObject.myIntProperty = 10;
如果您真的有那么多需要直接发送给构造函数的参数,那么最好选择简单地传递一个具有多个属性的Object。然后你的构造函数可以读取每个属性并决定如何使用它们:
public class MyObject extends sprite {
private var _myIntProperty:int;
public function MyObject(params:Object)
{
if(params.intProperty >= 0 && params.intProperty <= 10)
_myIntProperty = params.intProperty;
}
}