js原型继承_proto_、prototype总结

其实在工作中使用原型继承非常简单,只是为构建函数的prototype属性(这个属性本身就是一个对象)添加想要的方法,然后通过此构建函数new出来的实例就都可以使用这些方法了。

(构建函数与普通函数的区别也很简单,构建函数是一个函数初始化的过程,没有返回值;普通函数一般都是为了服务于某功能所以一般都会返回某个值,如果执行一个没有返回值的函数会得到undefined的结果,而如果对一个有返回值的函数执行new的操作则会报错此函数不是构造函数)。

此处作总结是因为虽然工作上要使用原型继承很简单,但是面试时面试官问到这个时要回答起来比较麻烦,所以总结一下这题目里的这两个属性。

首先是除了函数外,任何一个对象都自带_proto_这个属性,这个属性的初始化会指向对象的原型的prototype属性。

也就是var a=new B();的时候,实际上会在实例化a的同时,执行a._proto_=B.prototype;的过程,于是当在a上面访问某个方法时,如果a本身没有这个方法,就会去找a._proto_,由于它指向了B.prototype,然后就在B.prototype上面找了,然后由于任何对像都自带_proto_属性的,如果在B.prototype身上还没找到对应方法,就会去找B.prototype._proto_,然后再找下一层(此时一般是之前就对B.prototype进行了其他赋值,如B.prototype=C.prototype,或者B.prototype=D{},又或者B.prototype=new C()这样的操作,才有下一步,否则就已经到Object.prototype了),一直找到Object.prototype,如果还是没找到,就返回undefined;

至于prototype属性(这是一个对象),它只存在于函数(包括普通函数与构建函数)以及Object身上,其他类型的数据是没有的,比如函数的实例化是没有的:var p=new B();p.prototype为undefined;

(其实就是每个对像身上都有一个用于实现继承的属性,在函数身上是prototype,在其他数据身上是_proto_,有prototype的不会同时出现_proto_,反之亦然)

你可能感兴趣的:(js原型继承_proto_、prototype总结)