1.prototype
prototype属性是一个显式原型属性,只有函数才有这个属性,当我们创建一个函数时,prototype就产生了,这个prototype是一个对象,并且只有一个属性constructor,指向构造函数本身。
2.proto
每个对象都有一个隐式原型属性,指向创建该对象的函数的原型。这个属性实际指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用 proto 来访问。因为在 JS 中是没有类的概念的,为了实现类似继承的方式,通过 proto 将对象和原型联系起来组成原型链,得以让对象可以访问到不属于自己的属性,你不知道的Javascript解释这实际是一个委托。
3. new的过程
- 创建一个空的对象
- 链接到原型
- 绑定this
-返回放回这个对象
function create() {
//新建一个对象
let obj = {}
// 获得构造函数
let con = [...arguments][0]
// 将新对象的隐式原型链接到构造函数的显示原型
obj.__proto__ = con.prototype
// 执行构造函数将this绑定到新的对象上
let result = con.apply(obj,arguments)
// 判断result是否是对象,并返回对象
return typeof result === 'object' ? result: obj
4. 原型链
原型链的示意图
每个对象和原型的__proto__ 都指向他的父原型,他的父原型的__proto__又指向他的父原型。这样沿着隐式原型查找属性就是原型链。
4.总结
原型链的形成真正是靠__proto__ 而非prototype,当JS引擎执行对象的方法时,先查找对象本身是否存在该方法,如果不存在,会在原型链上查找,但不会查找自身的prototype。
一个对象的__proto__记录着自己的原型链,决定了自身的数据类型,改变__proto__就等于改变对象的数据类型。
函数的prototype不属于自身的原型链,它是子类创建的核心,决定了子类的数据类型,是连接子类原型链的桥梁。