开始以为自己明白了关于实例和原型的问题,今天听老师说了感觉还差的好远;
两个对象,A和B
1:A=new B
2:A.prototype=new B
3:A.prototype=B.prototype
1:第一个老师在视频中A是一个变量obj,是不是表示obj是B的实例,obj作为B的实例和B都有一个指针指向了B的原型?
如果这里的obj是一个对象A是不是意味着这个对象A有一个指针指向了B的原型,同时作为对象,他还有一个默认的指针指向了他本身的原型object.prototype?一个对象可以有两个原型链的继承嘛;求指点
2:A作为一个对象。第一种想法是他有一个自带的prototype,如果这是我给他的prototype指向了new B;是不是说给他的默认的原 型指向了B的原型;
第二种想法是他的自带的原型指向了A,然后通过A再向上到A的原型;
3:A.prototype=B.prototype:此时也是A和B的指针同时指向了B的原型,似乎和第2个的第一种想法类似;
3和2中的第一个似乎有相同之处;他们之间的差别是不是2中的A有自己的原型.然后通过他的原型到B的原型;而三中的A直接将B的原型作为自己的原型了,也就是说此时我如果改变A的原型也就意味着将B的原型改变了,毕竟他们本是就是一个东西嘛。
我知道自己想的说的一塌糊涂了,不过还是希望能将自己的想法说出来,希望能有大神分析一下给指出哪里不对,以及上面几种继承的不同之处,拜谢
我不是大神,在这里说一下自己的想法,自己理解的这个,我也不知道是不是正确,你可以看看:
对于1.A=new B,就像ppt中的obj= new foo()一样,a是一个变量obj,表示obj是B的实例,obj的[[proto]]是指向B的说明obj的原型就是B,也就是a的object.prototype就是B,而B再往上指向B自己的原型,此处没有矛盾,而obj变量也就是a对象只有一个原型链。。。下面2和3也可以按照这种思路理解
楼主说的我也没完全看明白,不过基于那三个表达式,我是这样理解的
1:这时候A其实是用构造器方法New B()实例化的一个对象,当然A的原型其实就是B.prototype,因为严格来说A就是B的一种存在方式,但是此时A不能再作为构造器实例化其他函数,正因为它是B的实例化,即不不能使用var c=new A();这也是它跟下面第二个表达式的本质区别
2:A.prototype=new B(); new B()其实就是创建了一个空对象,并且继承了B的原型,但是不会影响B自己的引用,即修改A是不会污染B的,可以说实现了继承,此时可以用A构造器方法实例化新的对象。例如视频例子用boson=new student(...);这是一种可行的继承。
3.这种就是将A.prototype直接指向了B.prototype,即他们的原型就同一引用,而不是像第二个方法,创建了一个B的空对象给A提供引用。这样会导致修改A,B也会跟着变化,就是我说的互相污染,显然不是继承应该有的现象。
我也是刚看JS没多久,可能说的有好多不对的地方,希望能起一点作用。