面向对象的三大特征包含:封装、继承、多态。现简单介绍一下——继承。
继承有以下几种方式:
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
等。。。