js 原型链,其实就是对象,方法的一些关系,首先要明确一点,对象实例是没有prototype,函数才有prototype
废话不多说我们一些console一下都是写什么东西
/* 首先我们创建一个对象 */ let obj = {} /* 上面的和下面是一样的,都是一个空对象 */ let obj2 = new Object() console.log(obj.prototype) // 输出undefined /* 证明对象实例确实是没有prototype的 */ /* 让后我们查看一下obj.__proto__ */ console.log(obj.__proto__)/* 行吧输出了一对东西无法判断 */ /* 我们猜测一下 */ console.log(obj.__proto__===Object.prototype) //输出true /* 上面一行 完全等于,证明这是一个东西*/ /* 那Object.__proto__ 又指向的啥,打印一下 */ console.log(Object.__proto__) // ƒ () { [native code] } /* 有点像一个函数 */ /* 猜测一下 */ console.log(Object.__proto__ === Function.prototype) //输出true /* 原来指向的是这里 */ /* 那我们继续看一下 Object.prototype.__propo__ 是啥*/ console.log(Object.prototype.__proto__) //输出 null /* 到null了,证明到头了,没东西了 */ /* 那上面就是对象的一整条原型链了 */ /* 那下面我们看一下函数的 */ /* 首先看一下构造函数 */ function Person () { name: 'cz' } let p1 = new Person() /* p1是一个对象,根据上面的他只有__proto__ */ console.log(p1.__proto__) // constructor ƒ Person() console.log(p1.__proto__ === Person.prototype) //true /* 下面就是一个正常的函数了 */ /* Person 就是一个函数 */ console.log(Person.__proto__) // ƒ () { [native code] } /* 上面这个看着有点像,挺像,之前,Object.__proto__ */ /* 那就不用考虑了 */ console.log(Person.__proto__ === Function.prototype) //ture /* 再看一下 Function.__proto__*/ console.log(Function.__proto__) //ƒ () { [native code] } /* 然是这样,Funtion的显示原形和隐式原形相等 */ console.log(Function.__proto__.__proto__) /* 输出,constructor: ƒ Object() 有点意思*/ /* 上面的不是 Function.__proto__.__proto__ === Function.prototype.__proto__*/ /* 那最终是不是有道对象上去了 */ console.log(Function.prototype.__proto__ === Object.prototype) //输出true
function 最终又到Object,不得不说一切都对象
总结一下
重点重点,实例对象没有prototype,
最终Object.prototype.__proto__ 指向的null
Function.prototype === Function.__proto__
Function.prototype.__proto__ === Object.prototype
实例对象的__proto__ 只想构造函数的 prototype
构造函数的__proto__ (构造函数其实是一个对象) 当然具体构造函数名.prototype
具体构造函数名.__proto__只想 Function.prototype 也等于 Function.__proto__
上面就是一条回路了。现在清晰了吧