面向对象三大特征之继承

面向对象的三大特征包含:封装、继承、多态。现简单介绍一下——继承

继承有以下几种方式:

1、实例继承  (也称:冒充继承,经典继承)(实例属性 和 实例方法)

通过call和apply,来继承,具体语法如下

fn.call(对象,参数一,参数二,……)
fn.apply(对象,[])
fn.apply(对象,arguments)

其中,arguments为伪数组,可以接收后面的所有参数

具体案例如下:

 
 
<script type="text/javascript">

function Superman(name,age){
    //Person.call(this,name,age); 
    // Person.apply(this,[name,age]);
    Person.apply(this,arguments);
}
       
var sm = new Superman('小王',12);
alert(sm.showName());    //小王
</script>

2、原型继承

通过prototype原型继承(原型属性 和 原型方法)

<script type="text/javascript">
        //原型
        function Person(){}
        
        //原型属性
        Person.prototype.name = '小王';
        Person.prototype.age = 20;
        //原型方法
        Person.prototype.showName = function(){
            return this.name;
        }
        Person.prototype.showAge = function(){
            return this.age;
        }
        
        //超人的构造函数
        function Superman(){}
        
        //Superman.prototype = Person.prototype;
        //Superman.prototype = new Person();
        for(let key in Person.prototype){
            Superman.prototype[key] = Person.prototype[key];
        }
        Superman.prototype.name = "人才";
        
        var sm = new Superman();
        alert(sm.showName());
        
        var ps = new Person();
        alert(ps.showName());
    </script>

 3、混合继承

实例属性通过call 或 apply实现继承,实例方法通过prototype原型继承,具体案例如下:

<script type="text/javascript">
        //原型
        function Person(name,age){
            //实例属性
            this.name = name;
            this.age = age;
        }
        
        //原型属性)(这里注释掉,是因为这里要做混合继承,要用实例属性)
//         Person.prototype.name = '小王';
//         Person.prototype.age = 22;
        //原型方法
        Person.prototype.showName = function(){
            return this.name;
        }
        Person.prototype.showAge = function(){
            return this.age;
        }
        
        function Superman(name,age){
            Person.apply(this,arguments);
        }
     //遍历Person中的所有原型方法prototype,然后赋值给Superman的原型prototype
for(let key in Person.prototype){ Superman.prototype[key] = Person.prototype[key]; } let sm = new Superman('小皮',20); alert(sm.showName()); </script>

4、对象冒充

通过类似的方法实现继承:this.student = Person; (student为子类,Person为父类)
function Person(name,age){
this.name = name;
this.age = age;
this.show = function(){
console.log(this.name+", "+this.age);
}
}

function Student(name,age){
this.student = Person; 
this.student(name,age);
//可以删除对象中指定的实例属性
//delete student.name
//删除对person的引用
//delete this.student; 
}

var s = new Student("小王",22);
s.show();
// 小王, 22
var p = new Person("小皮",20);
p.show();
// 小皮, 20

等。。。

猜你喜欢

转载自www.cnblogs.com/-roc/p/9945557.html