zoukankan      html  css  js  c++  java
  • js五种继承优缺点

          

      //1.原型继承
      //缺点: 当父级的属性有引用类型的时候,任意一个实例修改了这个属性,其他实例都会受影响
       // 1)基本类型:Number Boolean String undefined null
       // 2)引用类型:Object Function
    function Person(){
    this.class = '人';
    this.name = '张三';
    this.say = function(){
    console.log(this.name);
    }
    };

    function Man(name,age){
    this.name = name;
    this.age = age;
    };
    Man.prototype = new Person();
    var man = new Man('广发',18);
    console.log(man);

      //2.借用构造函数继承
        //缺点:父类的方法会被创建多次
    function Person(){
    this.class = '人类';
    this.say = function(){
    console.log('我是人类');
    }
    }
    function Man(name,age){
    this.name = name;
    this.age = age;
    //借用构造函数
    Person.call(this);
    }
    var man = new Man('广发',18);
    console.log(man);
    var man2 = new Man('广发',20);
    console.log(man.say===man2.say);//false

      //3寄生式继承
    function Person(o){ //参数o是一个传进来的对象
    缺点:没用到原型,无法复用
    var obj = Object.create(o);
    //console.log(obj._proto_ === o); //false
    obj.class = '人类';
    obj.say = function(){
    console.log(this.name);
    }
    return obj;
    }
    //要传入的对象
    var aman = {
    name:'广发',
    age:100
    }
    var man = Person(aman);
    console.log(man);

      //4.组合式继承
        //唯一缺点:父类的构造器被调用了两次
    function Father(){ //父级
    this.class = '人类';
    alert('测试被调用多少次');
    };

    Father.prototype.say = function(){ //把方法放到原型里
    console.log(this.name);
    }
    function Child(name,age){
    this.name = name;
    this.age = age;
    Father.call(this);//借用构造函数
    }
    Child.prototype = new Father();//Child原型继承了Father,这样就可以调用原型里面的方法了
    var man = new Child('广发',18);
    console.log(man);
    var man2 = new Child('广发',20);
    console.log(man.say === man2.say);//true,因为在原型里面都能调用,所以他们这个方法是相等的

      // 5 终极版 寄生组合式继承
        //什么?缺点?你信不信我打你
    function Person(){
    this.class = '人类';
    alert('测试调用了几次');
    }
    Person.prototype.say = function(){
    console.log(this.name);
    }
    Man.prototype = Object.create(Person.prototype);
    function Man(name,age){
    this.name = name;
    this.age = age;
    Person.call(this);
    }
    var man = new Man('广发',18);
    console.log(man);

    有时候玩着玩着就找不到原型构造器了,所以我们要重新找回构造器

    //构造器重定向(找回构造器)
    Man.prototype.constructor = Man;

    1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。

    2. 相同点:这两个方法的作用是一样的。

    都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。

    一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。

    说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。

    简单明了

     apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
    call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
  • 相关阅读:
    使用hibernate实现树形结构无限级分类
    专家看台:盛大架构师周爱民回顾职业历程,分享十项建议
    开始运行命令大全
    rsvp.exe,AdskScSrv.exe ,avp.exe
    Web2.0 编程思想:16条法则
    李嘉诚:性格才是命运的决定因素
    中兴笔试题目
    管理Websphere的10个有用命令
    我的程序语言实践
    20200514:实现分布式Session的过程是怎样的?
  • 原文地址:https://www.cnblogs.com/gfweb/p/9512886.html
Copyright © 2011-2022 走看看