一图了解原型链
1. 什么是原型?
- 原型分为两种 显示原型 prototype 和 隐示原型__proto__。
- 在js中所有函数基本上都有 prototype这个属性,属性值是一个普通的对象。
- 在js中所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象。
- 有一个例外
let fun = Function.prototype.bind()
此时fun没有原型。 - 所有引用类型的__proto__属性指向它构造函数的显示原型prototype
- 函数原型中有一个属性constructor 构造函数 指向函数本身
2. 什么是原型链?
- 简单来说原型链就是通过隐示原型__proto__可以找到其构造函数的原型上的属性,依次寻找上层知道寻找到
Object.prototype.__proto__ === null //true
- 原型链是用来共享与继承的一个对象链
3. new的时候发生了什么,手写一个new
- 创建一个对象
- 隐示原型指向构造函数的原型
- 绑定this
- 返回新对象
function create() {
let obj = new Object();
let Constructor = [].shift.call(arguments);
obj.__proto__ = Constructor.prototype;
let result = Constructor.apply(obj, arguments);
return typeof result === 'object' ? result : obj
}
function A(){}
var a = new A();
create(A)
4. 三个特殊 注意的地方
Object.prototype.__proto__ === null
对象原型的隐示原型指向空Object.__proto__ === Function.prototype
因为对象也是函数创造的,所以对象的隐示原型指向函数的原型Function.prototype === Function.__proto__
因为 函数也是被Function创造的所以 函数的隐示原型指向函数的原型- 除了Function.prototype 和 Object.prototype两个特殊对象,他们是由引擎创造的,其他对象都是通过构造器 new 出来的