原型Prototype

prototype应该是Javascript里最核心的内容了。原型链继承的概念神马的估计都背熟了,但其实在应用中又该怎么玩呢?

原型链是什么

如果myObject上不存在a属性时,我们就将注意力转向对象的[[Prototype]]链:

1
2
3
4
5
6
var anotherObject = {
a: 2
};
// 创建一个链接到`anotherObject`的对象
var myObject = Object.create( anotherObject );
myObject.a; // 2

这个处理持续进行,直到找到名称匹配的属性,或者[[Prototype]]链终结。如果在链条的末尾都没有找到匹配的属性,那么[[Get]]操作的返回结果为undefined

XHR2那些事儿

XMLHttpRequest Level 2

使用AJAX好多年了吧,相信创建一个请求监听什么状态都驾轻就熟了,还有什么好说的呢。问题来源于最近公司在优化图片上传的接口。所以来总结以下XMLHttpRequest Level 2的一些东西。

Formdata

AJAX 操作往往用来传递表单数据。为了方便表单处理,HTML 5新增了一个 FormData 对象,可以用于模拟表单。

1
var formData = new FormData(form)

新版 XMLHttpRequest 对象,不仅可以发送文本信息,还可以上传文件。

1
2
3
4
5
var input = document.getElementById("input"),
formData = new FormData();
formData.append("file",input.files[0]); // file名称与后台接收的名称一致
xhr.open('POST', form.action);
xhr.send(formData);

关于this

this应该是Javascript里永恒的面试题。这次只说说硬绑定里的陷阱题。

硬绑定

求下面这个题目的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function foo(cb) {
cb();
}
var a = {
a: "a in a",
getA:function(){
console.log(this.a);
}
};
var b = {
a: "a in b"
};
var getA = a.getA;
var getA2 = getA.bind(a);
a.getA();//"a in a"
getA();//a
foo(a.getA);//a
getA2.call(b);//"a in a"

ES6一二三

ES6一些总结

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的新标准,它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。ES6新增了一些值得思考的内容,下面来拜一拜最受瞩目的三个吧。

Module

ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。

1
2
// ES6模块
import { stat, exists, readFile } from 'fs';

上面代码的实质是从fs模块加载3个方法,其他方法不加载。这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。当然,这也导致了没法引用 ES6 模块本身,因为它不是对象。

Node.js实践

Node.js做一个爬虫

一个临时的支线小任务,用node做一个爬虫,爬点贴吧的数据。

Express

express 是 Node.js 应用最广泛的 web 框架),可以用来建立一个强大的服务器端应用,包括中间件,模板引擎,路由等强大功能。
启动一个express最简单的服务代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 这句的意思就是引入 `express` 模块,并将它赋予 `express` 这个变量等待使用。
var express = require('express');
// 调用 express 实例,它是一个函数,不带参数调用时,会返回一个 express 实例,将这个变量赋予 app 变量。
var app = express();
// app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在这里我们调用其中的 get 方法,为我们的 `/` 路径指定一个 handler 函数。
// 这个 handler 函数会接收 req 和 res 两个对象,他们分别是请求的 request 和 response。
// request 中包含了浏览器传来的各种信息,比如 query 啊,body 啊,headers 啊之类的,都可以通过 req 对象访问到。
// res 对象,我们一般不从里面取信息,而是通过它来定制我们向浏览器输出的信息,比如 header 信息,比如想要向浏览器输出的内容。这里我们调用了它的 #send 方法,向浏览器输出一个字符串。
app.get('/', function (req, res) {
res.send('Hello World');
});
// 定义好我们 app 的行为之后,让它监听本地的 3000 端口。这里的第二个函数是个回调函数,会在 listen 动作成功后执行,我们这里执行了一个命令行输出操作,告诉我们监听动作已完成。
app.listen(3000, function () {
console.log('app is listening at port 3000');
});