忽然覺得當前的JavaScript庫設計的多多少少有點不方便。
尤其是當使用一個object做config的時候。
比如以下的代碼我們應該是相當熟悉的:
1 $.ajax({
2 url:'/books/10086',
3 type:'GET',
4 cache:false
5 });
OK, 那麼, 對於一些複雜的config, 我們如何知道, 用什麼名字? 比如作者支援的是content-type, 還是data-type, 還是MIME-Type, 還是他用了什麼別的名字?
我們沒法知道。 我們只能去查文檔。 而文檔去哪查, 往往讓我們頭疼不已。 有的開源的東西壓根就沒文檔。 你想知道怎麼用? 去看代碼吧。
實際上設計者只要稍稍做個改變就行了。
比如我們這麼寫:
1 (function () {
2 var cloneObject = function (obj) {
3 var result = {};
4 for (name in obj) {
5 result[name] = obj[name];
6 }
7 return result;
8 };
9 var defaultConfig = {
10 cache: false,
11 contentType: 'text/html'
12 };
13 window.$ = {};
14 $.ajax = function (config) {
15 var ajaxConfig = config(cloneObject(defaultConfig));
16 };
17
18 $.ajax(function (config) {
19 config.cache = false;
20 });
21 })();
那麼就可以這麼調用的時候, 如果不知道config裡面怎麼寫?
那太好辦了。 你把斷點設在調用的地方, 看下config裡面是什麼樣子的就可以了。
而那些預設的config, 我們不用, 也會存在。 是不是會有什麼效能消耗, 產生效能問題呢?
我知道一些完美主義者一定會這麼問的。
實際上答案是這樣的:
1 即使是正在使用的方案,就是config裡面只有幾項的, 你提供的config, 也許扔進去, 也是和一個預設的進行merge, 然後再用的。如果是這樣, 那麼效能相同。甚至節約了一個merge。
2 你的config會有成千上萬的配置項嗎?如果是的話, 那麼確實會產生效能問題, 不過相信我, 你首先面臨的將是設計問題, 效能問題反倒是其次的。
3 這屬於可控制的效能問題, 即使慢了, 最佳化起來也是最簡單的。 比如用一個共用的config, 在set裡面做文章。 set的時候只是攔截下記錄, 而共用的config對象,值不變。
何況這隻是胡思亂想, 提供個思路而已。