首页 > js原型链继承问题求解

js原型链继承问题求解

现在有js的两个类(就是两个函数),一个父类,一个子类,子类继承了父类,通过child.prototype= new parent()。来继承.然后再实例化一个子类,var obj = new child().
这时候在obj这个对象上查找一个属性的时候,首先在自己身上找,如果找不到就到对应类的原型上找(这里是child类的原型),如果这时候还是找不到就到父级(这里是parent)的原型上找,因为child.prototype.__proto__=parent.prototype。这里就有问题了,他不会到parent的内部找吗?
大晚上突然想到个问题,用手机打的...电脑关了,所以没有去验证会不会去父类的内部查找.....先来问问....如果会去父类内部查找,又是什么原理呢....


两个东西职责完全不同(虽然在JS中一切皆对象),前者用来把实例产生出来,后者用来给实例添加共享的属性。所以凭什么要到构造函数里面找属性?

另一个角度看:如果与其他面向对象语言类比一下,构造函数就像“类(class)”,构造函数的属性就像类变量(或类方法),原型的属性就像实例变量(或实例方法)。这样一来,某个实例对象去找属性时肯定要到原型上去找。


不会,你自己都写了:

child.prototype.__proto__=parent.prototype

所以可以认为child类的原型继承了parent的prototype属性所引用的对象,而非继承parent本身。要不然怎么能叫构造函数呢。


我们说obj是child的实例,只是一种方便的说法,实际上child是构造函数,构造函数是不参与原型链继承的,它只是一个函数,只是起一个new实例的作用,没有继承到原型的任何属性。

obj = new child()这一句,new出来的obj立即继承了child.prototype;同理child.prototype= new parent(),child.prototype继承了parent.prototype。

所以这条原型链是这样的:
obj(child实例) <= child.prototype(new parent赋值的,也就是parent的实例) <= parent.prototype <= Object.prototype

你把原型链看成父子链吧……构造函数只是妈妈,把孩子生出来而已……


你这弯绕多了就会晕,其实就是obj 相当于child的proptype的原型对象,child的proptype原型对象来自parent的实例也就是parent的proptype原型对象。共享属性情况下。。那还不是想要啥有啥


  1. 你所说的到parent内部去找是个什么意思?

  2. 属性查找时,先到当前对象找,找不到就到原型对象中去找,原型对象中还找不到,就在下一层到原型对象的原型对象去找,一直到Object.prototype,查找结束,还没找到返回undefeind

  3. prototype指向的也是一个对象

例子

function Parent(){
    this.superName='Parent';
}
Parent.prototype={
    otherName:'Other',
};
function Child(){
    this.subName='Child';
}
Child.prototype=new Parent();

var child=new Child();
console.log(child.subName);//输出 Child
console.log(child.superName);//输出 Parent
console.log(child.otherName);//输出 otherName
console.log(child.unName);//输出 undefined
【热门文章】
【热门文章】