1.原型链指向概念梳理
- javascript中只有对象一种数据类型,函数是一种特殊的对象
- 对象由对应的构造函数实例化得来
- 所有的object含有__proto__属性,所有的函数含有prototype属性(显示原型),对象的__proto__指向他的构造函数的prototype
- 大部分的对象都是对象构造函数顶端Object的实例
var arr = new Array()
arr.__proto__ === Array.prototype
var obj = new Object()
obj.__proto__ === Object.prototype
2.实例与构造函数的关系 首先明确个事情:对象由与之对象的构造函数实例得来,不同的对象的上级构造函数不一定相同。
var arr = [ ] (new Array())
var obj = { } (new Object())
var vue = new Vue()
上述三者都是对象,由不同的构造函数实例得出。所以各自拥有一部分特殊的方法,比如数组的join,filter,reduce方法,同时vue也会有vue特殊的方法。同时三个对象上也存在一部分公有的特性比如constructor,isPrototypeOf,valueOf,toString等,说明不同的构造函数得出的对象会集成一部分Object的方法。
所以可以初步得出结论:构造函数不同的对象,会继承不同的原型对象上的方法,同时都会继承一部分Object的方法
所以Object是javascript中的顶级构造函数吗?
我们通过原型链的指向来解释这个问题
var obj = new Object()
var arr = new Array()
object.__proto__ === Object.prototype
arr.__proto__ === Array.prototype
//上面是基本的原型链指向问题,实例的__proto__指向其构造函数的prototype
那我们再看一段
Object.__proto__ === Function.prototype
Array.__proto__ === Function.prototype
Function.__proto__ === Function.prototype
通过指向大概能得出,首先Javsascript中顶级构造函数是Function,无论是Object,Array甚至是Function自身都是 Function的实例,也就是说明:
函数是较为特殊的对象,Object并不是顶级构造函数,Function为顶级构造函数,其实例仍然为一个函数
var fun = new Function()
Object.__proto__ === fun.__proto__
Object.__proto__ === Function.__proto__
Object.__proto__ === Function.prototype
fun.__proto__ === Function.__proto__
//换种方式 说明 Object.__proto__ === fun.__proto__
var Object = new Function() Object和fun创建的过程相同
首先Object构造函数(任何构造函数)是通过顶级Function实例得到的,同时,Function即是顶级构造函数也是实例化后的对象。
array实例或者其余的非Obejct构造函数实例的对象与Object的关系
var arr = new Array()
arr.__proto__.__proto__ === Object.prototype
两种方法解释该问题
1.原型链的继承(后面详细讲)
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾
例如 instanceof的实现方式:首先进行对象的__proto__与对应的构造函数的prototype进行比对,如不同则继续调用 对象的__proto__.__proto__方式进行查找,直到返回值为null为止
2.通过 prototype 来分析(辅助分析)
var arr = new Array()
arr.__proto__ === Array.prototype
那么
arr.__proto__.__proto__ 可以替换为 Array.prototype.__proto__
那么 Array.prototype本质就是个基础对象,对象的__proto__会指向Object.prototype
得出结论:所有构造函数非Object的对象,其原型链最终会指向到Object.prototype ,所以Object为大部分对象的顶级构造函数,但不是js中的顶级构造函数,js中的构造函数均由Function实例化而成