**這個章節需要大家幫忙補充,一次性想不完那么多**
* * *
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#javascript-語言精粹)JavaScript 語言精粹
[http://book.douban.com/subject/3590768/](http://book.douban.com/subject/3590768/)
這本書很薄,只有 155 頁,但該講的幾乎都講了。大家想辦法搞來看看吧(我總不能很沒節操地給個電子版 PDF 鏈接在這里吧)。
js 這門語言,水很淺。沒有太復雜的地方可以鉆,但特么的坑又多。
上面的那本書是一定要看的。這本書專注在講 js 語法,其他 js 的書都過多地涉及了瀏覽器知識。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#javascript-之美)JavaScript 之美
* 其一:[http://fxck.it/post/72326363595](http://fxck.it/post/72326363595)
* 其二:[http://fxck.it/post/73513189448](http://fxck.it/post/73513189448)
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#繼承)繼承
js 前端不懂有什么好辦法,后端的話,很方便。
用 node 官方的?`util`?庫,下面是直接從官網摘抄來的:
~~~
var util = require("util");
var events = require("events");
function MyStream() {
events.EventEmitter.call(this);
}
util.inherits(MyStream, events.EventEmitter);
MyStream.prototype.write = function(data) {
this.emit("data", data);
}
var stream = new MyStream();
console.log(stream instanceof events.EventEmitter); // true
console.log(MyStream.super_ === events.EventEmitter); // true
stream.on("data", function(data) {
console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // Received data: "It works!"
~~~
js 是面向對象的,但是是“基于原型的面向對象”,沒有類。沒有多重繼承,沒有接口。沒有結構體,沒有枚舉類型。
但它的字面量哈希和 function 都足夠靈活,拼拼湊湊,上面那些東西都能“模擬”著用。
說到沒有類的這個問題,很多人總是要糾正其他人關于 js 原型的理解的。我覺得這是沒有必要的。基于原型又不是很牛逼,ES6不是照樣給出了 class 關鍵字嗎。不管類還是原型都是為了抽象,爛的東西始終爛,不好理解的始終不好理解。
最近學習 ios 的 swift,看見里面有不少相比 objc 舒服的改進。比如 objc 的“方法調用”,學的是 smalltalk 那一套,那不叫方法調用,而是消息傳遞。結果 swift 里面不照樣是方法調用的形式?
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#callback-hell)callback hell
用 eventproxy 和 async 已經能解決大部分問題。剩下的小部分問題,肯定是設計錯誤。:)
參見:
* 《使用 eventproxy 控制并發》:[https://github.com/alsotang/node-lessons/tree/master/lesson4](https://github.com/alsotang/node-lessons/tree/master/lesson4)
* 《使用 async 控制并發》:[https://github.com/alsotang/node-lessons/tree/master/lesson5](https://github.com/alsotang/node-lessons/tree/master/lesson5)
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#數據類型)數據類型
寫 js 很少去定義類。Object 的便利在多數其他語言需要定義類的場景下都能直接用。
js 中,用好 Number,String,Array,Object 和 Function 就夠了。有時用用 RegExp。
用于 js 這門語言本身的殘廢,大多數時候都采用“約定勝于配置”的思想來交互合作。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#控制流)控制流
很常規,C 語言那套。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#基本運算符)基本運算符
C 語言那套。二進制操作并不會降低效率,V8 很聰明的。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#計算型屬性)計算型屬性
也就是幫一個對象的屬性定義 get 和 set 方法,通過?`obj.value`?和?`obj.value=`?的形式來調用。
koa([http://koajs.com/](http://koajs.com/)?) 把這套玩得爐火純青。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#運算符重載)運算符重載
無
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#類型轉換)類型轉換
手動幫你需要轉換的類型的類定義?`.toxxx`?方法,比如?`.toString`,`.toJSON`,`toNumber`。
js 的隱式類型轉換用一次坑一次。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#相等比較)相等比較
在 js 中,務必使用?`===`?三個等于號來比較對象,或者自定義方法來比較,不要使用?`==`。
我最近做一個項目,從數據庫中取出的數據,雖然應該是字符型的,但有時它們是 String 的表示,有時是 Number 的表示。為了省事,會有人直接用?`==`?來對它們進行比較。這種時候,建議在比較時,把它們都轉成 String 類型,然后用`===`?來比較。
比如?`var x = 31243; var y = '31243'`,比較時,這么做:`String(x) === String(y)`
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#嵌套類型)嵌套類型
隨便弄。
function 構造函數、閉包、字面量哈希,都可以混在一起寫,多少層都行,無限制。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#拓展)拓展
當無法接觸一個類的源碼,又想幫這個類新增方法的時候。操作它的 prototype 就好了。但不推薦!
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#函數式編程)函數式編程
js 中,匿名函數非常的方便,有效利用函數式編程的特性可以使人寫代碼時心情愉悅。
使用 lodash:[https://lodash.com/docs](https://lodash.com/docs)
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#泛型)泛型
類型都經常忽略還泛型!every parammeter is 泛型 in js
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#權限控制)權限控制
類定義中,沒有 public private 等關鍵詞,都靠約定。而且經常有人突破約定。
有些 http 方面的庫,時不時就去 stub 原生 http 庫的方法,0.11 時的 node.js 完全不按章法出牌,所以很多這些庫都出現兼容性問題。
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#設計模式)設計模式
《解密設計模式-王垠》
[https://github.com/alsotang/node-lessons/blob/master/lesson14/%E8%A7%A3%E5%AF%86%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%8E%8B%E5%9E%A0.md](https://github.com/alsotang/node-lessons/blob/master/lesson14/%E8%A7%A3%E5%AF%86%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%8E%8B%E5%9E%A0.md)
### [](https://github.com/alsotang/node-lessons/tree/master/lesson14#構建大型項目)構建大型項目
從 npm 上面尋找質量高的庫,并用質量高的方式拼湊起來。
- 關于
- Lesson 0: 《搭建 Node.js 開發環境》
- Lesson 1: 《一個最簡單的 express 應用》
- Lesson 2: 《學習使用外部模塊》
- Lesson 3: 《使用 superagent 與 cheerio 完成簡單爬蟲》
- Lesson 4: 《使用 eventproxy 控制并發》
- Lesson 5: 《使用 async 控制并發》
- Lesson 6: 《測試用例:mocha,should,istanbul》
- Lesson 7: 《瀏覽器端測試:mocha,chai,phantomjs》
- Lesson 8: 《測試用例:supertest》
- Lesson 9: 《正則表達式》
- Lesson 10: 《benchmark 怎么寫》
- Lesson 11: 《作用域與閉包:this,var,(function () {})》
- Lesson 12: 《線上部署:heroku》
- Lesson 13: 《持續集成平臺:travis》
- Lesson 14: 《js 中的那些最佳實踐》
- Lesson 15: 《Mongodb 與 Mongoose 的使用》
- Lesson 16: 《cookie 與 session》
- Lesson 17: 《使用 promise 替代回調函數》