美文网首页
JavaScript混合式继承

JavaScript混合式继承

作者: 枫丶筱 | 来源:发表于2017-03-20 13:02 被阅读199次
    • 继承:自己没有的方法,其他对象有,把其他对象的方法拿过来使用,就像自己也拥有该方法一样。

      • 原型式继承:在 js 中, 方法定义在原型对象中, 而属性定义在实例对象中,调用方法的时候, 实例对象本身是没有该成员的, 但是依旧可以调用该方法, 好像这个方法就是该实例对象的一样. 因此, 我们称该实例对象继承自原型对象。

          <script>
              var Person={
                  sayHello:function(){
                      console.log('我是'+this.name+'今年'+this.age);
                  }
              } 
              function Student(name,age){//student构造函数
                  this.name=name;
                  this.age=age;
              }
              //这里把Person对象赋值到Student构造函数的原型对象上,这样Student构造函数的实例就可以运用Person对象的方法
              Student.prototype=Person;
              var s1=new Student('lilei',18);//根据Student构造函数创建一个实例对象s1.
              s1.sayHello();
          </script>
        
    • 混入:就是将一个对象中的成员加到另一个对象中(通过自定义extend方法完成继承)

           <script>
               var obj2={
                   name:'lilei',
                   sayHello:function(){
                       console.log('我是'+this.name);
                   }
               };
               var obj3={
                   age:18,
                   sayHello1:function(){
                       console.log('我是'+this.name+'今年'+this.age);
                   }
               };
               var obj1={
                   extend:function(obj){
                       //arguments为函数中默认的对象,里面存储着所有的函数传入参数。
                       for(var i=0; i< arguments.length;i++){
                           for(var k in arguments[i]){
                               this[k]=arguments[i][k];
                           }
                       }
                   }
               };
               
               obj1.extend(obj2,obj3);//将obj2和obj3混入到obj1中
               obj1.sayHello();//
               obj1.sayHello1();
           </script>
      
    • 混合式继承:将多个对象的各个功能混合在一起,就是通过混入的方式,加到构造函数的原型(prototype)上。

           <script>
               var Person={
                   
                   sayHello:function(){
                       console.log('我是'+this.name+'今年'+this.age);
                   }
               } 
               function Student(name,age){//student构造函数
                   this.name=name;
                   this.age=age;
               }
               Student.prototype.extend=function(obj){
                   for(var k in obj){
                       this[k]=obj[k];
                   }
               }
       
               var s1=new Student('lilei',18);//根据Student构造函数创建一个实例对象s1.
               var s2=new Student('lllli',18);//根据Student构造函数创建一个实例对象s2.
               //这样就是Student构造函数继承了Person对象。所有Student构造函数创建的实例都要Pserson对象的方法
               Student.prototype.extend(Person); 
               //这样就是Student构造函数的实例s1继承了Person对象。其他Student构造函数创建的实例都没有Pserson对象的方法
               // s1.extend(Person);
               s1.sayHello();
               s2.sayHello();
           </script>
      
    • 关于继承ES5中给我们内置了一个快速的方法:Object.create(对象)

            <script>
                var o={
                        name:'lilei',
                        age:16,
                        sayHello:function(){
                            console.log('我是'+this.name+'今年'+this.age);
                        }
                };
                //ES5中内置的Object.create()方法可以让我们快速的继承
                var obj=Object.create(o);
                obj.sayHello();
            </script>
    
    • Object.create()方法兼容低版本实现原理代码(主要封装一个函数,运用了原型式继承)

          <script>
              function Object_Create(obj){
                  if(Object.create){
                      return Object.create(obj);
                  }else{
                      function F(){}
                      F.prototype=obj;
                      return new F();
                  }
              }
          </script>
      
    • 上下文调用实现继承

            <script>
                var Person={
            
                    sayHello:function(){
                        console.log('我是'+this.name+'今年'+this.age);
                    }
                } 
                function Student(name,age){//student构造函数
                    this.name=name;
                    this.age=age;
                }
        
                var s1=new Student('lilei',18);//根据Student构造函数创建一个实例对象s1.
                var s2=new Student('lllli',18);//根据Student构造函数创建一个实例对象s2.
      
                Person.sayHello.call(s2);
            </script>

    相关文章

      网友评论

          本文标题:JavaScript混合式继承

          本文链接:https://www.haomeiwen.com/subject/towbnttx.html