原型:用来生产实例对象。
原型链:原型对象有个指针指向构造函数,实例对象又有一个指针指向原型对象,就形成了一条原型链,最终指向null。
如上图,SuperType是是一个函数,右侧的方框就是它的原型。
fn对象是从Fn函数new出来的,这样fn对象就可以调用Fn.prototype中的属性。
因为每个对象都有一个隐藏的属性——“__proto__”,这个属性引用了创建这个对象的函数的prototype。即:fn.__proto__ === Fn.prototype,对象都是函数创造出来的,而对象也可以理解为是属性的集合。
每个函数function都有一个prototype,即原型。每个对象都有一个__proto__,即隐式原型。
每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。只有Object.prototype的__proto__指向的是null
接下来就是这张经典的图,instanceof的原理也是基于原型链的查找。
javascript中包含六种基本数据类型和一种复杂数据类型,他们又可以被分为值类型(undefined boolean string number)和引用类型(object)
对于值类型,可以通过typeof判断,string/number/boolean都很清楚,但是typeof在判断到引用类型的时候,返回值只有object/function,这个时候就需要用到instanceof
通过原型链的查找,可以解答一些很容易出错的问题,例如:
第一句说明Object是Function的实例,图中可以看到Object.__proto__==Function.prototype;第二句Function.__proto__==Object.prototype;第三句是因为function是自身的实例,由自身创建。
原型链的构建是为了实现js中的继承。访问一个对象的属性,先查找基本属性,然后从.__proto__链中向上查找,hasOwnProperty()方法就是为了检测对象的属性属于自身还是原型。
本文参考https://www.cnblogs.com/wangfupeng1988/p/3977924.html
原文:https://www.cnblogs.com/zhouyyBlog/p/14274256.html