JavaScript,面向对象,实现继承,对象冒充和原型链继承,代码

说明面向对象的三个基本特征是:封装、继承、多态 。
call函数:预定义的JAVAScript方法,用来调用所有者对象作为参数的方法 。
上节内容:面向对象,类、对象、属性、方法,静态属性和方法,原型、原型链(prototype chain) 。
【JavaScript,面向对象,实现继承,对象冒充和原型链继承,代码】JavaScript作为面向对象的弱类型语言,继承也是其非常强大的特性之一,继承的3种方式:对象冒充实现继承、原型链实现继承、原型链+对象冒充实现继承 。
案例代码对象冒充实现继承
特点:可以继承构造函数中的属性及方法,没法继承原型链上的属性及方法 。
<!DOCTYPE html><html> <head><meta charset="utf-8"><meta name="description" content=""><meta name="viewport" content="width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no"><script type="text/javascript">// ====================================================================//// ES5中的继承// ====================================================================//function Person(){// 属性this.name="石崇";this.age = 20;// 方法this.run=function(){alert(this.name + ",在走路~");}}// 原型链上增加属性和方法Person.prototype.sex = "男";Person.prototype.strategy=function(){alert(this.name + "|" + this.sex + "|" + this.age + ",的谋略~");};// 静态属性Person.info="人";Person.toString=function(){return "这里是静态方法";}// ====================================================================//// 继承自Person原型链+对象冒充的组合继承方式// ====================================================================//function User(){// 对象冒充实现继承Person.call(this);}let user1 = new User();// 对象冒充实现继承,可以继承构造函数中的属性及方法user1.run();// 对象冒充实现继承,没法继承原型链上的属性及方法// user1.strategy(); // Uncaught TypeError: user1.strategy is not a function// ====================================================================//// 继承自Person原型链实现继承// ====================================================================//function Manager(){}// 原型链实现继承Manager.prototype = new Person();//let manager1 = new Manager();// 既可以继承构造函数中的属性及方法又可以继承原型链上的属性及方法manager1.run();manager1.strategy();</script> </head> <body> </body></html>原型链实现继承
特点:继承的类的构造函数无法传值 。
<!DOCTYPE html><html> <head><meta charset="utf-8"><meta name="description" content=""><meta name="viewport" content="width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no"><script type="text/javascript">// ====================================================================////function Person(name,age){// 属性this.name= name;this.age = age;// 方法this.run=function(){alert(this.name + ",在走路~");}}// 原型链上增加属性和方法Person.prototype.sex = "男";Person.prototype.strategy=function(){alert(this.name + "|" + this.sex + "|" + this.age + ",的谋略~");};// 静态属性Person.info="人";Person.toString=function(){return "这里是静态方法";}//原型链实现继承function Manager(){}// 原型链实现继承Manager.prototype = new Person();// 实例化子类时没法给父类传参let manager1 = new Manager("彭祖",400);manager1.run();manager1.strategy();// 实例化子类时没法给父类传参let manager2 = new Manager("颜回",14);manager2.run();manager2.strategy();</script> </head> <body> </body></html>原型链+对象冒充实现继承
<!DOCTYPE html><html> <head><meta charset="utf-8"><meta name="description" content=""><meta name="viewport" content="width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no"><script type="text/javascript">// ====================================================================//// 原型链+构造函数的组合继承模式// ====================================================================//function Person(name,age){// 属性this.name= name;this.age = age;// 方法this.run=function(){alert(this.name + ",在走路~");}}// 原型链上增加属性和方法Person.prototype.sex = "男";Person.prototype.strategy=function(){alert(this.name + "|" + this.sex + "|" + this.age + ",的谋略~");};// 静态属性Person.info="人";Person.toString=function(){return "这里是静态方法";}//原型链实现继承function Manager(name,age){Person.call(this,name,age);}// ========================================//// 原型链实现继承// Manager.prototype = new Person();// 或者Manager.prototype = Person.prototype;// ========================================//// 实例化子类时没法给父类传参let manager1 = new Manager("彭祖",400);manager1.run();manager1.strategy();// 实例化子类时没法给父类传参let manager2 = new Manager("颜回",14);manager2.run();manager2.strategy();</script> </head> <body> </body></html>


推荐阅读