• 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对象的方法。
  • 相关阅读:
    微信5.0绑定银行卡教程
    从陈坤微信号说起:微信公众平台开发者的江湖
    微信商业化解读
    微信公众平台开发(63)汽车查询
    微信公众平台开发(64)航班动态
    张小龙的微信帝国诞生记
    微信公众平台开发(65) 微博树洞
    微信公众平台开发(66)人品计算
    扫奖网-免费抽奖信息聚集平台
    微信公众平台开发(67)百度百科
  • 原文地址:https://www.cnblogs.com/gfweb/p/9512886.html
Copyright © 2020-2023  润新知