zoukankan      html  css  js  c++  java
  • js继承的实现方式

    js的面向对象是基于原型的,因此js的对象继承方式也有些特殊,下面我具体谈一下js的几种常用继承方式

    1.使用new方法继承

    实现原理:在子类的构造函数中调用父类的构造函数。

    function Parent(name){
        this.name = name;
        this.age = 40;
        this.sayName = function(){
            console.log(this.name);
        }
        this.sayAge = function(){
            console.log(this.age);
        }
    }
    function Child(name){
        this.parent = Parent;
        this.parent(name);
        delete this.parent;
        this.saySomething = function(){
            console.log(this.name);
            this.sayAge();
        }
    }
    var child = new Child('Lee');
    child.saySomething();
    //Lee
    //40

    2.使用call方法实现

    实现原理:使用call方法改变函数上下文this指向,使之传入具体的函数对象。

    function Parent(name){
        this.name = name;
        this.age = 40;
        this.say = function(){
            console.log(this.name + this.age);
        }
    }
    function Child(name){
        Parent.call(this,name); 
    }
    var child = new Child('Mike');
    child.say();//Mike40

    3.使用apply方法实现

    实现原理:使用apply方法改变函数上下文this指向,使之传入具体的函数对象。

    function Parent(name){
        this.name = name;
        this.age = 40;
        this.say = function(){
            console.log(this.name + this.age);
        }
    }
    function Child(name){
        Parent.apply(this,[name]);
        //Parent.apply(this,arguments); 效果同上
    }
    var child = new Child('Wade');
    child.say();//wade40

    4.使用原型链(prototype)方法实现

    实现原理:子类的原型对象指向父类的实例,即重写类的原型。

    function Parent(name){
        this.name = name;
        this.say = function(){
            console.log(this.name +' '+ this.age);
        }
    }
    function Child(age){
        this.age = age;
        this.saySomething = function(){
            console.log(this.name);
        }
    }
    Child.prototype = new Parent('petter');
    var child = new Child(20);
    child.say();//petter  20

    5.使用混合方式实现

    实现原理:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。

    function Parent(age){
        this.name = 'petter';
        this.age = age;
    }
    Parent.prototype.say = function(){
        return this.name + ' ' + this.age;
    }
    function Child(age){
        Parent.call(this,age);
        //Parent.apply(this,[age]);
        this.age = age;
    }
    Child.prototype = new Parent();
    var child = new Child(21);
    child.say();//petter  21

    6. 寄生组合继承

    实现原理:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的混合继承的缺点

    function Animal(name){
        this.name = name;
        this.sleep = function(){
            console.log(this.name + 'is sleeping');
        }
    }
    function Cat(name){
      Animal.call(this);
      this.name = name || 'Tom';
    }
    (function(){
      // 创建一个没有实例方法的类
      var Super = function(){};
      Super.prototype = Animal.prototype;
      //将实例作为子类的原型
      Cat.prototype = new Super();
    })();
    // Test Code
    var cat = new Cat();
    console.log(cat.name);//Tom
    console.log(cat.sleep());//Tom is sleeping
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); //true
  • 相关阅读:
    性能调试工具
    c++11笔记
    根据样式创建内嵌页面
    VMware安装两张网卡
    【赵强老师】使用Oracle的跟踪文件
    【赵强老师】Kafka的消息持久化
    【赵强老师】Kubernetes的探针
    【赵强老师】阿里云大数据ACP认证之阿里大数据产品体系
    【赵强老师】NoSQL数据库之Cassandra基础
    【赵强老师】使用Weblogic的WLST工具
  • 原文地址:https://www.cnblogs.com/nurdun/p/7139632.html
Copyright © 2011-2022 走看看