2013-11-28 161 views
3

創建者類生成他的孩子。如果孩子被點擊,最好的方式是調用Creator的ClickedOnMyChild?調用父對象函數

function Creator() 
{ 
    var c1 = new Child("Albert"); 
    var c2 = new Child("Sarah"); 

    var ClickedOnMyChild = function() 
    { 
     //alert name of child 
    } 
} 

function Child(name) 
{ 
    this.name = name; 

    function ClickHandler() 
    { 
     // a click on me, better call my Creator 
    } 
} 

我的想法至今:

  1. 靜態的創造者(不,我需要實例)
  2. 觸發自定義事件中的孩子(我最喜歡到目前爲止)
  3. 通行證父實例子(不是一個好的做法)
+2

沒有 「最好」 的方式,這取決於你的需求。最簡單的就是'c1.click = function(){...}',然後你只需要在子節點上調用'click'。 – Jon

+5

選項3有什麼不好? (特別是當你知道孩子需要能夠告訴父母的東西。) – nnnnnn

+0

如果你想'c1'和'c2'堅持'Creator'對象,它們必須被定義爲'this.c1 ... '和'this.c2 ...' –

回答

2

我會去第二個:觸發Child中的自定義事件。因爲它不僅可以讓你處理你父母的事件,而且對事件感興趣的還有any objects

下面是一個示例代碼:

function Event(sender) { 
     this._sender = sender; 
     this._listeners = []; 
    } 

    Event.prototype = { 
     attach: function (listener) { 
      this._listeners.push(listener); 
     }, 
     notify: function (args) { 
      for (var i = 0; i < this._listeners.length; i++) { 
       this._listeners[i](this._sender, args); 
      } 
     } 
    }; 

function Creator() 
{ 
    var c1 = new Child("Albert"); 
    var c2 = new Child("Sarah"); 

    c1.click.attach(function (sender,args){ 
     //alert name of child 
     alert(args); 
    }); 

    c2.click.attach(function (sender,args){ 
     //alert name of child 
     alert(args); 
    }); 
} 

function Child(name) 
{ 
    this.name = name; 
    this.click = new Event(this); 

    var _this = this; 
    function ClickHandler() 
    { 
     _this.click.notify(_this.name); 
    } 
} 

參考鏈接:http://alexatnet.com/articles/model-view-controller-mvc-javascript

+0

來解決。真的很好。用示例代碼。我會用它來進行外教。 – bergman

2

選項編號3. is indeed a good practice。如果你曾經編程過某個東西,那麼你需要保持層次結構,你就會明白它有多棒。

function Child(name) 
{ 
    this.name = name; 
    this.creator = null ; 

    this.setCreator = function(creator){ 
    this.creator = creator ; 
    } 

    this.clickHandler = function() 
    { 
     if (this.creator) 
     this.creator.clickedOnMyChild(); 
    } 
} 

注:

  • 函數名稱應當用小字母開頭
  • 公共屬性和方法,你可以通過調用setCreator方法的子類改變這一點,並明確設置創建者Creator類必須分配給this關鍵字。否則,你將無法在課堂以外使用它們。
+0

也許他們不應該公開? – Bergi

+0

也許他們不是,但我真的認爲事件處理程序應該是公共方法。 – vikingmaster

+0

我一直認爲父母過世是不好的習慣。我必須照顧它。 – bergman