**这个章节需要大家帮忙补充,一次性想不完那么多**
* * *
### [](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 替代回调函数》