js学习中的总结——几种继承模式

2018-6-29    seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

     js中构造函数的几种继承模式浅析

一、原型链模式继承

    利用原型让一个引用类型继承另一个引用类型的属性和方法 。

    用的最多。

    缺点:不可传参,不可多继承。


        
  1. function People(name, age) {//添加公有属性
  2. name = name || 'xiaolan';
  3. age = age || 18;
  4. this.name = name;
  5. this.age = age;
  6. }//创建一个名为People的类
  7. People.prototype.eat = function() {//添加私有属性
  8. console.log(this.name + '贼能吃');
  9. }
  10. function Cat(color) {//创建一个名为Cat的类
  11. this.color = color;
  12. }
  13. Cat.prototype = new People('小叮当', 200);//实例化一个People类,并赋值给Cat类的原型链
  14. var cat = new Cat('蓝白色')
  15. console.log(cat.name)//'小叮当'
  16. cat.eat();//'小叮当贼能吃'

二、混合模式继承

    用call的方法只能继承私有属性,所以再加一遍一遍原型链模式继承,原型链模式继承又把私有属性和公有属性都继承了一遍。


        
  1. function People(name, age) { //创建一个父级People类
  2. name = name || 'xiaolan';
  3. age = age || 18;
  4. this.name = name;
  5. this.age = age;
  6. }
  7. People.prototype.eat = function() {
  8. console.log(this.name + '贼能吃');
  9. }
  10. function Cat(color, name, age) {
  11. this.color = color;
  12. People.call(this, name, age); //通过call的形式继承
  13. //通过call(this),将People的指向改为Cat的实例
  14. }
  15. var cat = new Cat('蓝白色', '小叮当', 1);
  16. console.log(cat.name);//'小叮当'
  17. cat.eat();//报错,
  18. //继承不了公有属性,所以cat.eat()会报错;

为了继承公有属性,用原型链模式在把公有属性和方法继承过来,


        
  1. function People(name, age) { //创建一个父级People类
  2. name = name || 'xiaolan';
  3. age = age || 18;
  4. this.name = name;
  5. this.age = age;
  6. }
  7. People.prototype.eat = function() {
  8. console.log(this.name + '贼能吃');
  9. }
  10. function Cat(color, name, age) {
  11. this.color = color;
  12. People.call(this, name, age); //通过call的形式继承
  13. //通过call(this),将People的指向改为Cat的实例
  14. }
  15. Cat.prototype = new People()
  16. var cat = new Cat('蓝白色', '小叮当', 200)
  17. console.log(cat)
  18. console.log(cat.name); //'小叮当',在原型链继承的时候,就近原则,cat.name 先找到'小叮当',就不往下找了
  19. cat.eat(); //'小叮当贼能吃'

三、拷贝继承

    优点:可以多继承,可传参;

    缺点:浪费资源,不能判断父级;


        
  1. function People(name, age) { //创建一个父级People类
  2. name = name || 'xiaolan';
  3. age = age || 18;
  4. this.name = name;
  5. this.age = age;
  6. }
  7. People.prototype.eat = function() {
  8. console.log(this.name + '贼能吃');
  9. }
  10. function Cat(color, name, age) {
  11. this.color = color;
  12. var people = new People(name, age) //实例化一个People类
  13. for (let i in people) {
  14. this[i] = people[i]; //将people中的可枚举属性和方法遍历并附给Cat类,公有属性和私有属性都是可枚举属性;
  15. }
  16. }
  17. var cat = new Cat('蓝白色', '小叮当', 2);
  18. console.log(cat.name); //小叮当
  19. cat.eat(); //小叮当贼能吃

四、寄生组合方式继承

    优点:私有属性和公有属性都单独继承,可以传参;

    私有属性可以多继承,公有属性不可多继承;


        
  1. function People(name, age) {
  2. name = name || 'xiaolan';
  3. age = age || 18;
  4. this.name = name;
  5. this.age = age;
  6. }
  7. People.prototype.eat = function() {
  8. console.log(this.name + '贼能吃');
  9. }
  10. function Cat(color, name, age) {
  11. this.color = color;
  12. People.call(this, name, age) //用call的形式把私有属性继承过来
  13. }
  14. function Fn() {} //创建一个中间构造函数,用来接收People的公有属性,为了防止创建实例Cat实例是影响原来的people构造函数
  15. Fn.prototype = People.prototype;
  16. Cat.prototype = new Fn(); //将中间构造函数Fn继承people的公有属性传给Cat的原型链
  17. Cat.prototype.constructor = Cat; //由于上一步重置了Cat原型链的constructor属性,所以要重新给赋回来;
  18. var cat = new Cat('蓝白色', '小叮当', 3);
  19. console.log(cat.name); //'小叮当'
  20. cat.eat() //'小叮当贼能吃


注:若有不严谨与错误的地方,请多指教!






  1. 这里写图片描述



蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


分享本文至:

日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档