继承,指一个对象直接使用另一对象的属性和方法。
继承机制规定,子类可以拥有超类的所有属性和方法,也可以
扩展定义
自己特有的属性,
增加
新方法和
重新定义
超类的方法
。并且不会影响到父类本身所具有的属性方法。
若子类的原型直接要指向父类的的原型,当子类修改或增添原型方法时,也会改变父类的原型方法,因为子类和父类的原型引用是一样的。此时,这些增添的属性方法不是子类所特有的,违背了继承的机制。看下面一个例子:
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