2014-11-06 186 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