最近在看js的原型链,自己也遇到很多问题,也去看了很多关于这些的博客,看的云里雾里。所以也想写篇博客和大家分享下自己的收获和遇到的一些问题。
首先,来说下js的对象:
Object这是最顶层的对象,我们见到的其他对象都是间接或者直接通过它衍生的。然后在来说说我们应用比较多的Function对象,通过new Function()创建的都是函数对象,这也是我们接触算是比较多的对象。所有的函数都有prototype属性,当然这仅仅限于函数。其他想Date,Math等等,都算比上面2个等级要低。
然后再来看原型对象,它具有prototype属性,当我们定义函数的时候,他就会被创建。在js中基本每个对象都可以被继承,而原型对象就是其中不可缺少的一环。原型对象是包含特定类型的所有实例共享的属性和方法,这也就代表着可以让所有实例对象共享它包含的属性和方法。
function person(){};
console.log(typeof person.prototype) //=> Object
console.log(typeof Object.prototype) //=> Object
console.log(typeof Function.prototype) // 特殊 Function
console.log(typeof Function.prototype.prototype) //undefined 函数对象却没有prototype属性
这里有个特殊例子(Function.prototype是个例外,它是原型对象,却又是函数对象,作为一个函数对象,它又没有prototype属性。)
v
当然,原型对象还有constructor属性,这个属性一般是指向构造函数对象的。当我们调用某种方法或者查询某些属性时,首先会在自身查找,如果自身没有,就会进入到它的__proto__属性中调用查找,这个也就是它构造函数的prototype中查找,这样一步步寻找下去,是不是有种链子的感觉了呢?
接下来,说说原型链:
上面已经说了,__proto__实际上就是一个指针,通俗点说,谁构造了它,他就指向谁的prototype。
var a = new Object()
a.__proto__ == Object.prototype //true
以上面为例,a是我们定义的一个object的实例,按照我们所说,是object构造了它,所以我们的a的__proto__将指向object的prototype属性。当我们实际应用a的时候,第一步会在自身寻找方法或者属性,如果未找到,就会进入object的prototype中去寻找。而实际应用中,往往比此例复杂的多,而几乎所有的js对象都有__proto__对象。由此可见,___proto__是实现原型链的关键,但prototype也是原型链不可缺少的部分。
而众所周知,js的继承机制就它只能通过原型链来继承,所以熟悉原型和原型链,会给我们在js的道路上带来很大帮助。最后附上一张图:
希望可以帮助到大家,欢迎大家指正错误,本人是第一次写博客,也是一个小白,欢迎大家交流。