对子类的原型要指向父类的实例而不是父类的原型的理解

继承,指一个对象直接使用另一对象的属性和方法。
继承机制规定,子类可以拥有超类的所有属性和方法,也可以 扩展定义 自己特有的属性, 增加 新方法和 重新定义 超类的方法 。并且不会影响到父类本身所具有的属性方法。
若子类的原型直接要指向父类的的原型,当子类修改或增添原型方法时,也会改变父类的原型方法,因为子类和父类的原型引用是一样的。此时,这些增添的属性方法不是子类所特有的,违背了继承的机制。看下面一个例子:
function P(){}
function C(){}
var p = new P(); 
C.prototype = p; //C的原型指向P的实例
C.prototype.test = function(){
  console.log("C的特有方法");
}
var p = new P();
var c = new C();
c.test();
p.test();
可以发现C的原型增添方法,并不会对父类P有任何影响。
若修改为:
function P(){}
function C(){}
var p = new P(); 
C.prototype = P.prototype; //C的原型指向P的原型
C.prototype.test = function(){
  console.log("C的特有方法");
}
var p = new P();
var c = new C();
c.test();
p.test();

C的原型增添方法,导致父类P也增加了一个test方法,且P的实例都有了test()这个原型方法。
总结:
子类如果更改了prototype,那么更改的东西也是附加到p这个实例上的,对P构造函数和P的原型没有影响。如果你直接写C.prototype = P.prototype,那你对C的prototype的任何修改都会同时修改P的prototype
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值