AS3:嵌套函数+自引用VS构造函数级函数和变量

时间:2014-11-06 08:50:59

标签: actionscript-3 optimization global-variables

我有两种方法来构建我的课程,我想知道哪种方式会更正确。

选项#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;
    }
}

1 个答案:

答案 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;
    }
}