简约风解析 javascript 原型及原型链
一般情况下,javascript中万物皆对象,它有两大类数据类型:
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)、函数(Function)
js定义的变量,均为对象,它自身拥有_proto_这个指针,它指向构造它的对象的对象的prototype,prototype是一个属性,本身也是一个对象,因此prototype也有_proto_指针,如图所示
a这个变量是字符串,相当于new String('233'),构建它的对象为String, 据图可知,a._proto_ === String.prototype,即_proto_为指针,指向构造它的对象的对象 的prototype。
String, Number,Array,Object等,它们可以通过new关键字来创建,可说是Function的实例,而Function.prototype为匿名函数,如图,可证所有的函数都有prototype属性,拥有prototype属性的对象大部分(某些不能使用new关键字创建的工具函数,像Math)为函数,从此可以看出Function在js里是食物链的项端呀
看图分析:
person是Person的一个实例,综上所述,实例对象的_proto_指针是指向创建它的对象的对象的prototype,person实例是可以访问挂载在Person的原型上的say方法的,也就是说,_proto_是原型链上的节点,是一个关键节点,prototype是原型链的组成,当实例访问一个方法或属性时,它会先在自身查找,透过_proto_,然后再沿原型链找,找到则调用,没找到报错,如果原型链本身没有的话,它自身透过_proto_去查找它的原型链,直到Object.prototype(javascript中,对象的最终原型链为Object.prototype, Object.prototype._proto_ 为null)查到这个都没有的话,那就真的没有了。