0

因此,我正在製作這個關於監獄和囚犯等的應用程序,我正在使用Observer Pattern。 理想情況下,我想只有一個名爲App的全局變量,並且我想在我的App中使用提供的Observer Pattern代碼(在上面的鏈接中)作爲幫助。Javascript代碼結構

例如

function App() { 
    this.helpers = { 
     prisoners: function ObserverList() { 
      this.observerList = []; 

      ObserverList.prototype.Add = function(obj){ 
       return this.observerList.push(obj); 
      }; 
      //more stuff 
     }, 

     prison: function Subject() { 
      this.observers = new ObserverList(); 

      Subject.prototype.AddObserver = function(observer){ 
       this.observers.Add(observer); 
      }; 
      //more stuff 
     }, 
    ... 
    }; 
    this.alcatraz = new this.helpers.prison(); 

我的問題是,是否在維修而言,這是有意義的,最佳實踐等? 它肯定比僅僅將Observer代碼轉儲爲App內部的一些內部函數要好。

由於此次重組,在prison中存在一個問題。由於所有觀察者模式函數現在是this.helpers裏面的鍵/值對,所以我應該將this.observers = new ObserverList();更改爲new this.helpers.prisoners();之類的值,但this的值已更改,並且我不知道如何使用new運算符call/apply。 (如果這甚至有意義)。

此外,我將不勝感激任何源(書/博客/視頻),有真實世界友好的例子,而不是代碼片段。對於Addy Osmani和他的作品沒有任何反應,他對於所有這些免費資源都是一個了不起的人,但是對於一個讓所有人點擊在一起的新人來說,有時候比親筆者會認爲的更困難(特別是考慮到Javascript允許的自由度)

如果我的問題聽起來「過於通用」或「非建設性」,我會事先道歉,但我會很感激一些建議。

+3

我想知道這個問題是否會更適合[codereview.se]或可能[programmers.se]比這裏。 –

+0

這是一個通用的,這是真的,但也有明顯的代碼問題(結構除外),所以我認爲它可以發佈在這裏。 – IgnorantUser

回答

0

我沒有使用觀察者模式,但這裏有我的想法:

  1. 調用適用於新剛意義。在JS中,new運算符有效地創建一個空白對象並將其分配給this。我會說它相當於ctor.apply({}),除了它不會返回新構造的對象(您必須先手動保存對象)

  2. 您可以事先定義ctor並僅實例化助手:

    function App() { 
    function helpers() { 
        var self = this; 
        this.prisoners = function ObserverList() { 
         this.observerList = []; 
         ObserverList.prototype.Add = function (obj) { 
          return this.observerList.push(obj); 
         }; 
         //more stuff 
        }; 
        this.prison = function Subject() { 
         this.observers = new self.prisoners(); 
         Subject.prototype.AddObserver = function (observer) { 
          this.observers.Add(observer); 
         }; 
         //more stuff 
        }; 
    }; 
    this.helpers = new helpers(); 
    this.alcatraz = new this.helpers.prison(); 
    } 
    

但個人如果你只是想創建類型的,我只是將它們聲明爲在適當範圍功能。就像:

function App() { 
    function prisoners() { 
     this.observerList = []; 
     ObserverList.prototype.Add = function (obj) { 
      return this.observerList.push(obj); 
     }; 
     //more stuff 
    }; 
    function prison() { 
     this.observers = new prisoners(); 
     Subject.prototype.AddObserver = function (observer) { 
      this.observers.Add(observer); 
     }; 
     //more stuff 
    }; 
    this.alcatraz = new this.prison(); 
}