原型链是实现继承的主要方法,通过原型能让一个引用类型继承另一个引用类型。
function SuperType(){this.superPRop=1;}SuperType.prototype={ showSuperprop:function(){ console.log(this.superprop); }}function SubType(){this.subprop=2;}SubType.prototype=new SuperType();SubType.prototype.showSubprop=function(){ console.log(this.subprop);}var s=new SuperType();s.showSuperprop();//1var s2=new SubType();s2.showSuperprop();//1s2.showSubprop();//2
注意:在使用原型链实现继承时,不能用对象字面量方法创建原型方法。
在子类型构造函数内部调用超类型的构造函数。
function SuperType(){this.numbers=[1,2,3];}function SubType(){SuperType.apply(this);}var s=new SubType();s.numbers.push(4);console.log(s.numbers);//1,2,3,4var s1=new SubType();console.log(s1.numbers);//1,2,3
使用原型链实现对原型对象属性和方法的继承,使用构造函数实现对实例对象属性的继承。
function Person(name){ this.name=name; this.numbers=[1,2,3];}Person.prototype.sayName=function(){ console.log(this.name);}function Student(name,age){ Person.call(this,name);////第二次调用Person() this.age=age;}Student.prototype=new Person();//第一次调用Person()Student.prototype.sayAge=function(){ console.log(this.age);}var s=new Student('小张',15);s.sayName();//小张s.sayAge();//15s.numbers.push(5);console.log(s.numbers);//[1, 2, 3, 5]var s1=new Student('小兰',14);s1.sayName();//小兰s1.sayAge();//14console.log(s1.numbers);//[1, 2, 3]
组合继承是很常用的继承方式,但是它也有个缺点,就是需要调用两次超类型的构造函数。
寄生组合式继承:借用构造函数继承属性,使用原型链的混合型式继承方法。寄生组合式是实现继承的最佳方式。
function object(o) { function F() { } F.prototype = o; return new F();}function inheritPrototype(superType, subType) { var prototype = object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype;}function superType(name) { this.name = name;}superType.prototype.sayName = function () { console.log('my name is ' + this.name);}function subType(name, age) { superType.call(this, name); this.age = age;}inheritPrototype(superType, subType);subType.prototype.sayAge = function () { console.log('my age is ' + this.age);}var s=new superType('Cathy');s.sayName();//my name is Cathyvar s1 = new subType('Tom', 18);s1.sayName();//my name is Toms1.sayAge();//my age is 18
新闻热点
疑难解答