js的原型链听着比较深奥,看着容易晕,梳理一下还是比较容易懂的
(先简单写下,后续有时间再整理)
简而言之
原型链:就是js的对象与对象之间,通过原型组成建立的层层关系,构成了整个链条,称之为原型链 (个人理解,欢迎交流)
对象
js中一切皆对象,我们看到的变量、函数、类型,都是顶级对象Object的实例,也就是说他们继承自Object,这种关系就体现在原型链上。
每个对象都有对应的构造函数,就用最简单的变量举例:
var a = 1;
console.log(typeof a); //number
console.log(a.__proto__); //Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}
console.log(Number.prototype); //Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}
你会发现最后2行输出是一致的,怎么回事呢?因为变量a赋值后为Number类型,也就是实例化了Number函数,实例化后会自动生成一个隐形的属性【__proto__】指向了父级对象的【prototype】属性
原型
上例中的 prototype 与 __proto__ 存在于js中的各个对象和函数中,就构成了原型链
- 对象没有 prototype 属性,只有函数有 prototype 原型对象
- 对象的 __proto__ 属性指向构造函数的 prototype 原型对象
- 原型对象也是对象,也有__proto__ 属性
- 直到指向Object.prototype后,到达顶级,Object.prototype.__proto__ 为 null