2014-11-06 187 views
0

我有两种方法来构造我的类,我想知道哪种方式会被认为更正确。AS3:嵌套函数+自引用VS构造函数级函数和变量

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

匿名函数在AS3中形式不正确,不应使用。将变量和函数保持为私有的问题是什么?这样只有对象本身才能访问这些函数/变量。和构造函数(以及函数)支持可选参数。 – DodgerThud 2014-11-06 09:17:30

+0

我认为第二个比第一个更好。 – akmozo 2014-11-06 11:23:52

+0

第二个问题是,如果我有10个参数,那么我需要在构造函数之外为我的函数创建10个重复变量以供使用。 – BladePoint 2014-11-06 13:16:38

回答

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; 

如果你真的有您需要将许多参数直接发送给构造函数,最好的方法是简单地将单个对象传递给多个属性。然后您的构造函数可以读取每个属性并决定如何使用它们:

public class MyObject extends sprite { 

    private var _myIntProperty:int; 

    public function MyObject(params:Object) 
    { 
     if(params.intProperty >= 0 && params.intProperty <= 10) 
      _myIntProperty = params.intProperty; 
    } 
} 
+0

我会在范围示例中添加,如果值低于0或大于10时抛出错误是一种很好的做法,所以任何试图将myIntProperty设置为超出范围的值的人都知道他们不应该。否则,他们可能会引入错误,然后花费大量时间进行调试。 – 2014-11-07 15:14:46