本節書摘來自異步社群《ember.js實戰》一書中的第2章,第2.5節,作者:【挪】joachim haagen skeie(喬基姆•哈根•斯基)著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
ember.js擴充了javascript預設對象類的定義,以建構一個更強大的對象模型。此外,ember.js還支援基于混入類的方式,在子產品與子產品之間、應用與應用之間共享代碼。
你可能想了解ember.js是怎樣知道某個屬性發生改變的,以及它何時觸發觀察者函數和綁定對象。同時你可能還注意到,ember.js總是要求使get()和set()方法來擷取或修改ember.object子類對象的屬性。當在一個屬性上調用set()方法,ember.js就會檢查更新值與對象原有屬性值是否不同,如果不同,ember.js就會觸發綁定對象、觀察者函數或者計算屬性函數。
盡管剛接觸ember.js時使用get()和set()方法看起來可能有點不習慣,但這卻是確定ember.js統一智能處理觀察者、綁定、計算屬性以及dom操作的重要機制。實際上,使用get()和set()方法是ember.js解決涉及多個dom元素更新及綁定性能問題的重要基礎。
建立自定義ember.js對象通常有兩種方式,要麼通過extend()方法擴充其他ember.js對象并添加自定義功能,要麼用create()方法建立一個ember.js對象執行個體。無論選擇哪種方式,應用程式中建立的每個對象都以某種方式擴充自ember.object類,ember.object是基礎類,其確定ember.js能夠提供本書涉及的所有功能。
想像一下,不通過擴充ds.model來實作notes.note模型對象,繞開ember data,自己實作一個notes.note模型,如代碼清單2-9所示。
代碼清單2-9 建立notes.note對象

不像使用ember.object.create()建立一個匿名note執行個體,這裡通過擴充ember.object類建立了一個顯式的notes.note類。注意以下兩點。
現在還沒有notes.note類的執行個體,因為extend()方法并不`傳回一個執行個體。
note類開始于大寫的“n”,這個記号對于你,乃至ember.js架構,都意味着note是一個類定義,而非對象執行個體。
要建立notes.note類的新執行個體,請使用create()方法:
這時你可能會認為,我們仍看不到這種方式優于匿名ember.object.create()實作的地方。但是,對于ember.js應用中用到的所有資料類型和對象而言,顯式定義類通常是個好主意。即使這麼做需要更多的代碼,但你清晰地展示了執行個體化一個對象的意圖,并且可以明确分隔各個業務模型對象。最終代碼可讀性強、更易于維護,而且容易測試。
明确定義應用程式對象還使得在正确的地方添加觀察者、綁定以及計算屬性變得容易,并確定應用快速應變。考慮這樣一個場景,原先背景應用為每個note對象的value屬性提供了純文字實作方式,以将屬性值編碼成markdown格式,但現在要編碼成html格式了。如代碼清單2-10所示,如果在應用程式中顯式定義了notes.note,就很容易添加這個功能。
代碼清單2-10 添加計算屬性,将markdown格式轉換為html格式
一旦成功實作了notes.convertfrommarkdowntohtml函數,接下來就可以在應用視圖模闆中将原先使用value的方式更改為使用新增的計算屬性htmlvalue,這個改變顯然易如反掌;簡單更改視圖handlebars模闆(見代碼清單2-2)的代碼如下:
這樣,記事本應用程式就改好了。接下來具體了解ember.js mvc模式下各層之間如何同步資料。