最近在看JavaScript: The Good Parts,目前為止看的輕鬆愉快,內容講的很好。但是到了 Inheritance 一章 Parts
這一節的時候,完全傻眼了,根本不知道它在講什麼東西,求給點提示或者例子,以下是章節內容
Parts
We can compose objects out of sets of parts. For example, we can make a function
that can add simple event processing features to any object. It adds an on method,odod on method , and a private event registry:
var eventuality = function (that) { var registry = {}; that.fire = function (event) { // Fire an event on an object. The event can be either // a string containing the name of the event or an // object containing a type property containing the // name of the event. Handlers registered by the 'on' // method that match the event name will be invoked. var array, func, handler, i, type = typeof event === 'string' ? event : event.type; // If an array of handlers exist for this event, then // loop through it and execute the handlers in order. if (registry.hasOwnProperty(type)) { array = registry[type]; for (i = 0; i < array.length; i += 1) { handler = array[i]; // A handler record contains a method and an optional // array of parameters. If the method is a name, look // up the function. func = handler.method; if (typeof func === 'string') { func = this[func]; } // Invoke a handler. If the record contained // parameters, then pass them. Otherwise, pass the // event object. func.apply(this, handler.parameters || [event]); } } return this; }; that.on = function (type, method, parameters) { // Register an event. Make a handler record. Put it // in a handler array, making one if it doesn't yet // exist for this type. var handler = { method: method, parameters: parameters }; if (registry.hasOwnProperty(type)) { registry[type].push(handler); } else { registry[type] = [handler]; } return this; }; return that; };
We could call eventuality on any inpidual object, bestowing it with event handling
eventuality(that)
loose typing is a big benefit here because we are not burdened with a type system
that is concerned about line of class#. Instead, we can focus on the character
of their contents.
If we wanted eventuality to have access to the object's private state, we could pass it
the my bundle
#
英文的 "parts" 意思是部分,這裡我不知道該怎麼準確的描述它的意思。大概是說,可以用一些方法將多個「部分」組合在物件上,在建構函數中,當然就是組合在
this
上。例如eventuality
,簡化一下它會為傳入的物件
that
增加on()
和fire()
兩個方法用於事件的註冊和觸發,而閉包變數registry
用於保存註冊的事件(處理函數)。這個函數當然是為物件添加事件處理功能的。假如我們還有一個其它功能需要添加到對象,例如序列化為 JSON,也就是添加一個
toJson()
方法將當前對象序列化成 JSON 字符串,比如然後我們有一個
Boo
類,它除了自身的一些特性之外,還需要事件和 JSON 特性,那麼在其構造函數中就可以這樣後面兩句應該就是所謂的 compose parts 吧
補充
這種方法會為每個物件設定相關方法函數的副本,不能重複使用定義的方法,所以還是比較耗資源的。不過教程中引入這一段應該是為了引出後面的繼承這個知識點。
說到繼承,ES2015 語法上已經支援 class 和 extends,比起之前的建構函式方式更嚴格,也更方便,所以這部分我建議你多了解一下新的類別語法,不要太糾結舊的類別語法。以後有一定基礎也有時間的時候,如果有興趣,再去研究 JS 的原型機制和基於原型機制的 OO 實作。