借用构造函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
// function Person(name,age,sex,weight){
// this.name = name;
// this.age = age;
// this.sex = sex;
// this.weight = weight;
// }
// Person.prototype.sayHi = function(){
// console.log("您好");
// };
// function Student(score){
// this.score = score;
// }
// // 希望人的类别中的数据可以共享给学生----继承
// Student.prototype = new Person("小明",10,"男","50kg");
// var stu1 = new Student(100);
// console.log(stu1.name,stu1.age,stu1.sex,stu1.weight,stu1.score);
// stu1.sayHi();
// var stu2 = new Student(120);
// stu2.name = "张三";
// stu2.age = 20;
// stu2.sex = "女";
// console.log(stu2.name,stu2.age,stu2.sex,stu2.weight,stu2.score);
// stu2.sayHi();
// var stu4 = new Student(150);
// console.log(stu4.name,stu4.age,stu4.sex,stu4.weight,stu4.score);
// stu4.sayHi();
// 为了数据共享,改变原型指向,做到了继承----通过改变原型指向是实现的继承
// 缺陷:因为改变原型指向的同时实现继承,直接初始化了属性,
// 继承过来的属性的值都是一样的,所以,这就是问题
// 只能重新调用对象的属性进行重新赋值
// 解决方案:继承的时候,不用改变原型的指向,直接调用父级的构造函数的方式来
// 为属性赋值就可以了----借用构造函数:把要继承的父级的构造函数拿过来,使用
// 一下就可以了
// 借用构造函数:构造函数名字.call(当前对象,属性,属性,.....)
// 解决了属性继承,并且值不重复的问题
// 缺陷:父级类别中的方法不能继承
function Person(name,age,sex,weight){
this.name = name;
this.age = age;
this.sex = sex;
this.weight = weight;
}
Person.prototype.sayHi = function(){
console.log("您好");
};
function Student(name,age,sex,weight,score){
Person.call(this,name,age,sex,weight);
this.score = score;
}
var stu1 = new Student("小明",10,"男","10kg",100);
console.log(stu1.name,stu1.age,stu1.sex,stu1.weight,stu1.score);
var stu2 = new Student("小红",20,"女","40kg",120);
console.log(stu2.name,stu2.age,stu2.sex,stu2.weight,stu2.score);
var stu4 = new Student("小丽",50,"男","80kg",150);
console.log(stu4.name,stu4.age,stu4.sex,stu4.weight,stu4.score);
</script>
</head>
<body>
</body>
</html>
组合继承
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
// 原型实现继承
// 借用构造函数实现继承
// 组合继承:原型继承+借用构造函数继承
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.sayHi = function(){
console.log("hello");
};
function Student(name,age,sex,score){
// 借用构造函数:属性值重复的问题
Person.call(this,name,age,sex);
this.score = score;
}
// 不传值
// 改变原型指向----继承
Student.prototype = new Person();
Student.prototype.eat = function(){
console.log("吃东西");
};
var stu = new Student("小黑",20,"男","100分");
console.log(stu.name,stu.age,stu.sex,stu.score);
stu.sayHi();
stu.eat();
// 属性和方法都被继承了
var stu2 = new Student("小白",20,"女","100分");
console.log(stu2.name,stu2.age,stu2.sex,stu2.score);
stu2.sayHi();
stu2.eat();
</script>
</head>
<body>
</body>
</html>
拷贝继承
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
// 拷贝继承:把一个对象中的属性和方法直接复制到另一个对象中
// var obj1 = {
// name:"小糊涂",
// age:20,
// sleep:function(){
// console.log("睡觉了");
// }
// };
// 改变了地址的指向
// var obj2 = obj1;
// console.log(obj2.name,obj2.age);
// obj2.sleep();
// 拷贝继承:把一个对象中的属性和方法直接复制到另一个对象中
// var obj1 = {
// name:"小糊涂",
// age:20,
// sleep:function(){
// console.log("睡觉了");
// }
// };
// // 改变了地址的指向
// var obj2 = {};
// for(var key in obj1){
// // obj2.name = obj1.name;
// obj2[key] = obj1[key];
// }
// console.log(obj2.name
function Person(){
}
Person.prototype.age = 10;
Person.prototype.sex = "男";
Person.prototype.height = 100;
Person.prototype.play = function(){
console.log("玩的好开心");
};
var obj2 = {};
// Person的构造中有原型prototype,prototype就是一个对象,那么里面的age,sex
// height,play都是该对象中的属性和方法
for(var key in Person.prototype){
obj2[key] = Person.prototype[key];
}
console.dir(obj2);
obj2.play();
</script>
</head>
<body>
</body>
</html>
总结继承
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
// 面向对象特性:封装,继承,多态
// 继承,类与类之间的关系,面向对象的语言的继承是为了多态服务的
// js不是面向对象的语言,但是可以模拟面向对象.模拟继承.为了节省内存空间
// 继承:
/**
* 原型作用:为了节省内存空间,数据空间,目的是为了节省空间
* 原型作用:继承 目的是:节省内存空间
*
* 原型继承:改变原型指向
* 借用构造函数继承:主要解决属性的问题
* 组合继承:原型继承+借用构造函数继承
* 既能解决属性问题,又能解决方法问题
* 拷贝继承:就是把对象中需要共享的属性或者方法,直接遍历的方式复制到另一个
* 对象中
*
*
*/
</script>
</head>
<body>
</body>
</html>