原型和原型链
引用类型都是对象
原型与原型链
对象都有原型,原型也是对象,也有自己的原型,就组成了一条原型链。在对象上找某个属性没找到就会往原型链上找。
第一个🌰
1 | var obj = {}; |
Object、String、Boolean、Array、Number是构造函数,而声明的变量是它们的实例。
第二个🌰
1 | function test(name){ |
new的过程,从这里可以看出test1对象实例的__proto__指向test的prototype。constructor指向构造函数。
第三个🌰
1 | function test(name){ |
这里没打算贴原型链那张很复杂的图片
贴几个面试题
1.
1 | Function.prototype.a = 'a'; |
2.实现个简陋版instanceof方法
1 | function instanceOf(data, constructor) { |
这里可以知道[].__proto__.__proto__ === Object.prototype
,{}.__proto__ === Object.prototype
也就是说instanceof其实没办法区分对象与数组,那么怎么区分
1 | let arr = []; |
3.
1 | function Parent() { |
解析:
1 | function Parent() { |
总结
1.函数在创建的时候,会同时创建prototype对象,这个对象会自动获得constructor属性。
2.构造函数的实例的[[Prototype]]会指向构造函数的prototype属性,它们传递的是引用,而不是副本。
3.如果需要取不到对象上的属性和方法,就会往原型链上找。
4.原型链的顶部是null。