js中的原型与原型链详解
js中的原型与原型链详解
记住下面三句话就可以理解原型:
- 所有的函数数据类型都天生自带一个属性Prototype(原型)这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存
- 在浏览器给prototype开辟的堆内存当中有一个天生自带的属性是constructor,这个属性存储的值是当前函数本身
- 每一个对象都有一个__proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例)
原型链:如果引用构造函数的实例想要查找某个属性p的话:
- 首先会在实例内部属性中找一遍
- 接着会在实例.proto(构造函数.prototype)中找一遍
- 如果实例中还是没有,此时程序不会灰心,它会继续在实例的prototype的.__proto__中寻找,直到寻找到Object.prototype才结束,没有的话返回undefined
这种搜索的轨迹,形似一条长链, 又因prototype在这个游戏规则中充当链接的作用,于是我们把这种实例与原型的链条称作:原型链
判断原型与实例的关系
- 第一种是使用 instanceof 操作符, 只要用这个操作符来测试实例(instance)与原型链中出现过的构造函数,结果就会返回true
alert(instance instanceof Object);//true
alert(instance instanceof Father);//true
alert(instance instanceof Son);//true
- 使用 isPrototypeOf() 方法, 同样只要是原型链中出现过的原型,isPrototypeOf() 方法就会返回true
alert(Object.prototype.isPrototypeOf(instance));//true
alert(Father.prototype.isPrototypeOf(instance));//true
alert(Son.prototype.isPrototypeOf(instance));//true