面向对象的三个基本特征是:封装、继承、多态。
call函数:预定义的JAVAScript方法,用来调用所有者对象作为参数的方法。
上节内容:面向对象,类、对象、属性、方法,静态属性和方法,原型、原型链(prototype chain)。
JavaScript作为面向对象的弱类型语言,继承也是其非常强大的特性之一,继承的3种方式:对象冒充实现继承、原型链实现继承、原型链+对象冒充实现继承。
对象冒充实现继承
特点:可以继承构造函数中的属性及方法,没法继承原型链上的属性及方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no">
<script type="text/javascript">
// ====================================================================//
// ES5中的继承
// ====================================================================//
function Person(){
// 属性
this.name="石崇";
this.age = 20;
// 方法
this.run=function(){
alert(this.name + ",在走路~");
}
}
// 原型链上增加属性和方法
Person.prototype.sex = "男";
Person.prototype.strategy=function(){
alert(this.name + "|" + this.sex + "|" + this.age + ",的谋略~");
};
// 静态属性
Person.info="人";
Person.toString=function(){
return "这里是静态方法";
}
// ====================================================================//
// 继承自Person 原型链+对象冒充的组合继承方式
// ====================================================================//
function User(){
// 对象冒充实现继承
Person.call(this);
}
let user1 = new User();
// 对象冒充实现继承,可以继承构造函数中的属性及方法
user1.run();
// 对象冒充实现继承,没法继承原型链上的属性及方法
// user1.strategy(); // Uncaught TypeError: user1.strategy is not a function
// ====================================================================//
// 继承自Person 原型链实现继承
// ====================================================================//
function Manager(){
}
// 原型链实现继承
Manager.prototype = new Person();
//
let manager1 = new Manager();
// 既可以继承构造函数中的属性及方法又可以继承原型链上的属性及方法
manager1.run();
manager1.strategy();
</script>
</head>
<body>
</body>
</html>
原型链实现继承
特点:继承的类的构造函数无法传值。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no">
<script type="text/javascript">
// ====================================================================//
//
function Person(name,age){
// 属性
this.name= name;
this.age = age;
// 方法
this.run=function(){
alert(this.name + ",在走路~");
}
}
// 原型链上增加属性和方法
Person.prototype.sex = "男";
Person.prototype.strategy=function(){
alert(this.name + "|" + this.sex + "|" + this.age + ",的谋略~");
};
// 静态属性
Person.info="人";
Person.toString=function(){
return "这里是静态方法";
}
// 原型链实现继承
function Manager(){
}
// 原型链实现继承
Manager.prototype = new Person();
// 实例化子类时没法给父类传参
let manager1 = new Manager("彭祖",400);
manager1.run();
manager1.strategy();
// 实例化子类时没法给父类传参
let manager2 = new Manager("颜回",14);
manager2.run();
manager2.strategy();
</script>
</head>
<body>
</body>
</html>
原型链+对象冒充实现继承
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no">
<script type="text/javascript">
// ====================================================================//
// 原型链+构造函数的组合继承模式
// ====================================================================//
function Person(name,age){
// 属性
this.name= name;
this.age = age;
// 方法
this.run=function(){
alert(this.name + ",在走路~");
}
}
// 原型链上增加属性和方法
Person.prototype.sex = "男";
Person.prototype.strategy=function(){
alert(this.name + "|" + this.sex + "|" + this.age + ",的谋略~");
};
// 静态属性
Person.info="人";
Person.toString=function(){
return "这里是静态方法";
}
// 原型链实现继承
function Manager(name,age){
Person.call(this,name,age);
}
// ========================================//
// 原型链实现继承
// Manager.prototype = new Person();
// 或者
Manager.prototype = Person.prototype;
// ========================================//
// 实例化子类时没法给父类传参
let manager1 = new Manager("彭祖",400);
manager1.run();
manager1.strategy();
// 实例化子类时没法给父类传参
let manager2 = new Manager("颜回",14);
manager2.run();
manager2.strategy();
</script>
</head>
<body>
</body>
</html>