原型链
创建对象有几种方法
- 对象字面量
 
1  | var o1 = { name: "o1" }; // 对象原型链指向 object,故此归为一类  | 
- 通过构造函数
 
1  | var M = function(name) {  | 
- Object.create
 
1  | var p = { name: "p" };  | 
原型、构造函数、实例、原型链
- 函数才有 prototype,实例对象是没有 prototype 的,函数既是函数也是对象,因此有 proto
 
1  | M.__proto__ === Function.prototype; // true  | 
instanceof 的原理
- instanceof 的原理就是判断实例对象的 proto 与构造函数的 prototype 的引用是否相同
 - 只要在原型链上的构造函数,instanceof 都会返回 true
 
1  | o3 instanceof M; // true  | 
1  | function instanceof(left, right) {  | 
new 运算符
- 一个新对象被创建。它继承自 foo.prototype
 - 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文 (this)会被指定为这个新实例。new foo 等同于 new foo(),只能用在不传递任何参数的情况
 - 如果构造函数返回了一个“对象”,那么这个对象会取代整个 new 出来的结果。如果构造函数没有返回对象,那么 new 出来的结果为步骤 1 创建的对象
 
1  | // 代码模拟 new 函数执行的过程  | 
new 的过程
- 新生成了一个对象
 - 链接到原型
 - 绑定 this
 - 返回新对象
 
1  | function create() {  |