原型链
创建对象有几种方法
- 对象字面量
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() { |