好记性不如烂笔头,我说的
1、几个名词概念
- 构造函数:可以通过
new
关键词来调用的函数 - 实例:通过
new
关键词得到的对象 - 原型属性:
- 针对函数来说,指的是函数对象上的prototype属性,注意只有函数才有
prototype
属性 - 针对对象来说,指的是当前对象上的__proto__(非标准)属性,书面写作
[[Prototype]]
- 针对函数来说,指的是函数对象上的prototype属性,注意只有函数才有
2、基础知识点
- 构造函数本身也是一个对象,它既有
prototype
属性,也有__proto__
属性 prototype
和__proto__
属性值也是对象- 构造函数的
prototype
属性上有一个constructor
属性,它指向了构造函数本身, 即:Function.prototype.constructor === Function
- 正常创建的对象都有
__proto__
属性,Object.create(null)
没有__proto__
- 访问对象上的属性时候,会现在当前对象上查找,如果找不到再去
[[Prototype]]
上找,如果[[Prototype]]
上没有,则从[[Prototype]]
的[[Prototype]]
上继续找,如此往复一直到null
3、结论
Object.__proto__ === Function.prototype
// 简单点理解: const Object = new Function()Object.prototype.__proto__ === null
// Object作为构造函数,是所有对象的基类。Function.__proto__ === Function.prototype
// Function本身也是一个函数,同时Function也是所有函数的基类,简单理解: const Function = new Function()Function.prototype.__proto__ === Object.prototype
// Function.prototype本身也是一个对象,所以他的原型指向Object的原型- 所有非继承的构造函数的
[[Prototype]]
都指向了Function
的prototype,例如:String.__proto__ === Function.prototype