原型链的原因
构造函数有分类:自定义函数,官方提供的全局函数:String、Number、Bloolean、Array、Date、Math、Function、Object。
用关键字new创建对象的函数就是构造函数。
原型链思想
1)null(null是基本数据则null没有原型对象),系统内置的最初的原型对象是在null指针的基本上扩展的内存,所以用type检测时,null的指针和对象的指针前一个机器码一样则typeof检测null会返回字符串"object"
2)对象的功能和成员访问在自己内部没有时会去原型对象上或原型对象的原型对象上寻找,直到找到原型链的终点null都没有就不能使用功能,成员访问时就会返回undefined。
3)不同的对象彼此不能访问彼此自身的功能和成员,不在同一条原型链上的对象彼此不能访问其原型对象的功能和成员。
f1的原型链与Function.prototype不在同一条原型链上,则f1访问成员值时不能访问这条原型链上的原型对象的成员值。
对象与函数的关系
Function和Object
1)Object是一个官方提供的构造函数,Function也是一个官方提供的构造函数,而function是一个关键字。
2)所有函数都有一个prototype属性用这个函数创建的对象的原型对象就是这个属性引用的对象;所有对象都有原型对象就是对象的__proto__属性引用的对象。
3)实例对象通过构造函数进行创建
Object是Function的实例对象, Function.prototype是Object的实例对象。
instanceof和constructor
instanceof:如果右侧构造函数的prototype属性能在左侧的对象的原型链中找到, 那么就返回true, 否则就返回false
Object intanceof Function为true因为Object的__proto__ === Function.prototype;
Function instanceof Object为true因为Function的__proto__的__proto__ === Object.prototype。
实例对象的constructor属性指向其构造函数
原型链图
对象的__proto__原型链上会有一个指向Object.prototype,即一切引用数据都是对象。