对__protot__ 和prototype的一个基本认知
prototype --可理解为原型
__proto__ --可理解为原型链的链接点
prototype是函数的一个属性,本质上也是一个对象{}
__proto__是对象Object的一个属性,本质也是一个对象{}
这句话很重要:对象的__proto__等于对象构造函数的prototype
function Test(){}
const test = new Test()
console.log(test.__proto_ === Test.prototype) //true
用一句话来解释原型链
原型链就是以一个实例对象为基准以__proto__为链接的一直到object.prototype为止的链条.
当你想在实例对象中获取某个属性,就会按照这个链条一直往上进行查找.
Function和Object的特殊性
function Test(){}
首先思考以下Test这个函数是由什么构造出来的呢?答案是Function所以就会得到以下结论
console.log(Test.__proto__ === Function.prototype) // true
那么再想以下Function本身自己也是一个函数,那么它也应该有一个自己的__proto__,然后当你打印以下就会发现他的特殊性
console.log(Function.__proto__ === Function.prototype) // true
这看起来很不合理,但这是底层已经给你规定好的了那么下面又能推到出很有意思的东西.
console.log(typeof Object); // function 证明了Object是由Function构造而来的
console.log(Object.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.__proto__); // true