<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>继承</title> </head> <body> <script> /** * [使用对象冒充实现继承(多继承)] */ function Parent(name) { this.name = name this.sayName = function() { console.log(this.name) } } var iParent = new Parent('james') iParent.sayName() function Child(name) { this.parent = Parent this.parent(name) delete this.parent this.saySome = function() { console.log('my name: ' + this.name) this.sayName() } } var iChild = new Child('kobe') iChild.saySome() console.log(iChild.constructor) /** * Call/Apply方法改变函数上下文实现继承(该种方式不能继承原型链,若想继承原型链,则采用混合模式) * 实现原理:改变函数内部的函数上下文this,使它指向传入函数的具体对象 */ function Parent(firstname) { this.fname = firstname; this.age = 28; this.sayAge = function() { console.log(this.age); } } function Child(firstname) { Parent.call(this, firstname); // 将this传给父构造函数 //Parent.apply(this, [firstname]); // 与call作用相同 this.saySomeThing = function() { console.log(this.fname); this.sayAge(); } this.getName = function() { return firstname; } } var myChild = new Child('Lee'); myChild.saySomeThing(); console.log(myChild.constructor) myChild.constructor == Child; // true /** * 原型链实现继承 * 实现原理:使子类原型对象指向父类的实例以实现继承,即重写类的原型,弊端是不能直接实现多继承 */ function Parent() { this.sayAge = function() { console.log(this.age); } } function Child(firstname) { this.fname = firstname; this.age = 28; this.saySomeThing = function() { console.log(this.fname); this.sayAge(); } } Child.prototype = new Parent(); var myChild = new Child('Lee'); myChild.saySomeThing(); // Lee 28 /** * 混合模式 */ function Parent() { this.sayAge = function() { console.log(this.age); } } Parent.prototype.sayParent = function() { alert('This is parent!'); } function Child(firstname) { Parent.call(this); this.fname = firstname; this.age = 28; this.saySomeThing = function() { console.log(this.fname); this.sayAge(); } } Child.prototype = new Parent(); var myChild = new Child('Lee'); myChild.saySomeThing(); myChild.sayParent(); console.log(myChild.constructor) function Parent(hello) { this.hello = hello; } Parent.prototype.sayHello = function() { alert(this.hello); } function Child(hello, world) { Parent.call(this, hello); //将父类的属性继承过来 this.world = world; //新增一些属性 } Child.prototype = new Parent(); //将父类的方法继承过来 Child.prototype.sayWorld = function() { //新增一些方法 alert(this.world); } var c = new Child("zhangsan", "lisi"); c.sayHello(); c.sayWorld(); /** * es6继承 */ class Animal { //构造函数 constructor(props) { this.name = props.name || '未知'; } eat() { alert(this.name + "在吃东西..."); } } //class继承 class Bird extends Animal { //构造函数 constructor(props) { //调用实现父类的构造函数 super(props); this.type = props.type || "未知"; } fly() { alert(this.name + "在飞..."); } } var myBird = new Bird({ name: '鹦鹉' }) myBird.eat() myBird.fly() </script> </body> </html>
