关于原型继承

来源:6-3 选择练习

蛋挞狂魔

2021-01-15 01:14:35

function pT(){};

pT.prototype.name ="d";

function cT(){};

cT.prototype.name ="c";

cT = new pT();

alert(cT.name);

​请问老师,为什么这里不使用cT.prototype也可以改变name值呢?

是否原型继承不需要一定写上xx.prototype? 

想问一下原型继承具体有哪些形式

写回答

1回答

好帮手慕夭夭

2021-01-15

同学你好,问题解答如下:

1、使用构造函数自身继承和使用构造函数上面的原型继承本身都可以实现继承的,但是通过构造函数自身继承就不是原型继承了,只有在原型上继承才是原型继承。

2、是需要放在原型上继承的,具体参考如下

(1)当前代码中,继承实现原理就是实例化构造函数pT,这样实例对象拥有了构造函数的属性和方法,达到了继承。下面的代码中,把new pT();直接赋值给cT,那么原来的构造函数cT就被覆盖了,此时cT就不再是构造函数,而是pT的实例。如下:

http://img.mukewang.com/climg/60010ff50926463304610293.jpg

因为cT已经不是构造函数了,它自然不能实例化了:

http://img.mukewang.com/climg/6001100a095c4e8f04810093.jpg


所以同学所写的方式失去了继承的意义,因为已经把cT变成了pT的实例了,就好比如下写法了:

http://img.mukewang.com/climg/60010f4e09522bd504780260.jpg


(2)而prototype是原型的意思,它是构造函数上面的一个属性(每一个构造函数自带的属性),是一个对象。我们去通过实例化的方式继承的时候,只在构造函数cT的原型上继承pT。通俗的理解,拿构造函数cT上的一个属性去成为pT的实例,就不会影响到构造函数cT了。看如下例子:

cT.prototype = new pT()也只会覆盖cT的原型,cT自身可以去实例化,通过实例可以调用自身的属性和方法。

http://img.mukewang.com/climg/60011163096673cd05190419.jpg

而且原型是一个对象,即使之前原型被覆盖了,那么还是可以在新对象中重新添加属性的,如下:

http://img.mukewang.com/climg/6001120209f3b9ef05060198.jpg

结果:

http://img.mukewang.com/climg/6001128209ac1a8201960087.jpg

祝学习愉快~


0

0 学习 · 14456 问题

查看课程