//练习js继承(组合继承:原型继承和构造函数继承的组合) function Polygon(length, area) { this.length = length; this.area = area; } Polygon.prototype = { constructor: Polygon, getLength: function () { console.log(this.length);console.log(" Polygon--getLength()!"); }, getArea: function () { console.log(this.area); }, sayHello: function () { console.log("Hi,I'm Polygon!");} } function Triangle(length, area) { //继承属性 Polygon.call(this, length, area);//在子类对象上调用父类构造函数 //添加新属性 //this.a=a; } //继承方法 Triangle.prototype = new Polygon(); //注意:通过原型链实现继承时,不能使用对象字面量创建原型的方法,会导致重写原型链 /*Triangle.prototype = { constructor: Triangle, getLength: function () { console.log("Triangle length is " + this.length); }, getArea: function () { console.log("Triangle area is " + this.area); } }*/ Triangle.prototype.constructor = Triangle;//设置constructor属性 //重写父类方法 Triangle.prototype.getLength = function () { //Polygon.prototype.getLength.call(this); console.log("Triangle length is " + this.length); }; Triangle.prototype.getArea = function () { console.log("Triangle area is " + this.area); }; //添加新方法 Triangle.prototype.sayTriangle = function () { console.log("Hi,I'm Triangle!"); }; var polygon1 = new Polygon(1, 2); polygon1.getLength(); polygon1.getArea(); var triangle1 = new Triangle(12, 16); //调用子类重写的方法 triangle1.getLength(); triangle1.getArea(); //调用子类的新方法 triangle1.sayTriangle(); //调用父类未被重写的方法 triangle1.sayHello(); //调用父类被重写的方法 Polygon.prototype.getLength.call(triangle1);
console打印信息:
1
Polygon--getLength()!
2
Triangle length is 12
Triangle area is 16
Hi,I'm Triangle!
Hi,I'm Polygon!
12
Polygon--getLength()!