对象继承的几种方式

一. 对象冒充(又分为2种方式): 对象冒充方式的继承,只能继承父类函数内的属性,不能继承父类原型中的属性

方式一:   1. 让父类的构造函数成为子类的方法;
                2. 给子类的这个方法传入父类所拥有的属性,这就继承了父类的一些属性;
                3. 再在子类中删除这个方法;
                
                function Child(name, age) {
                    this.obj = Parent;
                    this.obj(name, age);
                    delete this.obj;
                }
                
                
        方式二 :  用call或apply的方式继承
                 function Child(name, age) {
                     Parent.call(this, name, age);
                 }
        
                 注意: apply方法中是用数组传入参数             
                 function Child(name, age) {
                     Parent.apply(this,[name, age]);
                 }
      
     
      说明: 方式一的功能等价于方式二的功能;两种方式都使Child继承了Parent.
                        
      
      代码详解:
      function Parent(name , age) {
            this.name = name;
            this.age = age;
            this.sayName = function() {console.log(this.name);}
        }
        
       function Child(name, age) {
            this.obj = Parent;
            this.obj(name, age);
            delete this.obj;
        //  Parent.call(this, name, age); 被注释的语句
        }
        var c = new Child("zhangsan", 21);
        console.log(c.name);
        
        Chiled函数---解释: 
        第一句:  this.obj = Parent:
                把Parent这个函数赋给obj,相当于obj就是一个函数,
                
        第二句:  this.obj(name, age);
                给obj这个对象传入参数,此时obj拥有了完整的Parent属性,
                又因为obj是Child这个函数的属性,所以就是把Parent付给了Child;
                此时Child就完全拥有了Parent的属性.
                
        第三句:  delete this.obj;
                上面两句已经使Child完全继承了Parent的属性,
                所以接下来删除obj这个函数(obj是Parent函数的一个对象).
                
        解释: Parent.call(this, name, age);
              call里面的this代表的是Child所创建的对象;
              call方法的调用(拿这句举例):
              Parent调用了call这个方法,代表,Parent函数内部的this指向的
              是传入call方法里面的对象.
              所以上面这条语句的功能就是让Child继承了Parent的属性

二. 原型继承(这种方式的继承,是继承了父类函数内的属性,同时也继承了父类原型中的属性)

原理: 1. 使子类的原型指向父类的实例(通过new创建的对象);  2. 在子类函数中,通过父类的构造器constructor对子类的属性进行初始化.

function Person(name, age){
            this.name = name;
            this.age = age;
            this.sayname = function(){
                console.log(this.name);
            }
         }
         Person.prototype.sayage = function () {
                console.log(this.age);
         };
         function Child(name,age,sex){
               //第二步: 下面这个congstructor指向的是父类(这其实是父类的constructor),用来继承到父类属性的初始化
                this.constructor(name,age);
                 this.sex = sex;
         }
         //第一步: 使子类的原型指向父类的实例
         Child.prototype = new Person(); 
         var c1 = new Child();
         c1.name = "zhangsan0";
         c1.age = 20;
         c1.sayname();
         c1.sayage();

三. 混合方式的继承(混合call的方式和原型链的方式)

原理: 属性通过冒充对象的call方法继承,行为通过原型链的方式继承(通过这样的继承方式,似乎子类不能设置原型中的属性,这点不明白)

function Parent(name,age){
        this.name = name;
        this.age = age;
        }
        Parent.prototype.sayage = function () {
            console.log(this.age);
        };
        Parent.prototype.sayname = function () {
            console.log(this.name);
        };
        function Child(name,age){
            //属性通过call方法继承
            Parent.call(this,name,age);
            this.sex = "meal";
        }
        //行为通过原型继承
        Child.prototype = new Parent();
        var c1 = new Child();
        var c2 = new Child();
        c1.name = "Tom";
        c2.name = "Tony";
       //返回Tom
        c1.sayname();
       //返回Tony
        c2.sayname();

时间: 2024-10-16 07:48:04

对象继承的几种方式的相关文章

JS对象继承的几种方式总结

今天学习了一下js的继承,js中的继承主要分四种,原型继承,构造函数继承,call/apply继承以及es6的extend继承.1.原型继承:原型继承主要利用js对象的prototype引用父类的构造函数来复制父类的方法. //定义一个Person类 function Person(name){ this.name=name; } //打招呼 Person.prototype.sayHello=function(){ alert("Hello,my name is "+this.nam

javascript继承的两种方式

javascript继承的两种方式 1,原型链 1 <script type="text/javascript"> 2 function A() 3 { 4 this.name='a'; 5 } 6 function B() 7 { 8 9 } 10 11 12 B.prototype=new A(); 13 var obj=new B(); 14 15 alert(obj.name); 16 </script> 2,对象冒充 1 <script type

js 实现继承的几种方式

//js中实现继承的几种方式 //实现继承首先要有一个父类,先创造一个动物的父类 function Animal(name){ this.name = name; this.shoot = function(){ console.log("yelp"); } } //动物的原型 Animal.prototype.eat = function(food){ console.log(name+"吃"+food); } //1.实例继承 var dog = new Ani

javascript中实现继承的几种方式

javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Child1(){ Parent1.call(this); this.type = "child1"; } 缺点:Child1无法继承Parent1的原型对象,并没有真正的实现继承(部分继承) 2.借用原型链实现继承 function Parent2(){ this.name = "p

面向对象的三大特征中的 “继承” 和继承的几种方式

学习继承之前,要先了解什么是面向对象:(把相同的代码提取(抽象)出来归为一类,把公共的方法挂在 这个类的原型上 的一种编程思想(开发模式)) >>原型和原型链,在,面向对象,的那个随笔分类里有细说.<< 面向对象的三大特征:抽象.封装.继承.(多态) 抽象:提取类似的部分. 封装:归类的过程. 继承:子类拥有父类的属性或者方法,自己也有自己的一套属性和方法. /******************************** 下面开始这篇随笔的主题:继承 和 继承的几种方式****

js实现继承的5种方式

js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现方式可以实现多继承)实现原理:让父类的构造函数成为子类的方法,然后调用该子类的方法,通过this关键字给所有的属性和方法赋值 Js代码   function Parent(firstname) { this.fname=firstname; this.age=40; this.sayAge=func

js如何实现继承(js实现继承的五种方式)

js继承有5种实现方式: 1.继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function(){ alert(this.username); } } function Child(username,password){ //通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承 //第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对

javascript实现继承的几种方式

原型链方式实现继承 [javascript] view plain copy print? function SuperType(){ this.property = true; this.colors = ['red','blue','green']; } SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){ this.subprototype = false;

javascript 模拟java 实现继承的5种方式

1.继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function(){ alert(this.username); } } function Child(username,password){ //通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承 //第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象, //第二步:执行th