JS本身不具备继承,是我们通过语法模拟出来的
// 例子:王思聪继承王健林的家产
var wjl = {
name: '王健林',
age: 55,
hours: '豪宅数套',
mony: '用不完的钱'
}
var wsc = {
name: '王思聪',
age: 28
}
//遍历王健林对象,把家产赋值给王思聪
for(var i in wjl) {
//当王思聪和王健林中有同名属性时,跳过
if(wsc[i]) {
continue;
}
wsc[i] = wjl[i];
}
console.log(wjl);
console.log(wsc);
其实上面只能算是对象的拷贝
// 继承是 类型和类型之间的关系
-------------------------原型继承--------------------------
function Teacher() {
/*this.name = 'zs';
this.age = 23;
*/
this.salary = 8007;
}
function Student() {
/*this.name = 'ls';
this.age = 44;*/
this.score = 90;
}
//上面有共同的代码,我们可以把他们抽出来,做一个共同的构造函数Person
function Person() {
this.name = '人类';
this.age = '你猜';
}
我们知道当调用一个属性时,如果本身的对象里没有,会去原型中查找,所以我们可以这样
Teacher.prototype = new Person();//原型也是一个对象
// 这个就是原型继承了,现在Teacher也有name和age属性了
// 原型继承并不能用,因为他只能给Person构造函数传一次参数,当我们要创建多个老师的时候,明显不能用
var teacher = new Teacher();
console.dir(teacher.__proto__.constructor);//返回的是Person的构造函数,所以我们还需要修改原型对象的constructor值
Teacher.prototype.constructor = Student;
console.dir(teacher.__proto__.constructor);//这下返回的是Student的构造函数了,记得如果修改了原型对象,要重新设置constructor的值
原型继承并不能用,因为他只能给Person构造函数传一次参数,当我们要创建多个老师的时候,明显不能用
---------------------------------借用构造函数的继承方式--------------------// 借用构造函数
利用了函数的call()方法,
// 创建Person的构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
//Person.sayHi()
Person.prototype.sayHi = function () {
console.log('你好');
}
// 创建Teacher的构造函数
function Teacher(name, age, score) {
// 将Person中的this指向Teacher
Person.call(this, name, age);
this.score = score;
}
使用借用构造函数这种方法可以继承属性,但是遗憾的是不能继承方法
-----------------------------------------组合继承-------------------------------------
// 组合继承(结合原型继承和借用构造函数继承)
// Person构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// Person的sayHi()方法
Person.prototype.sayHi = function () {
console.log('你好');
}
// Student构造函数
function Student(name, age, score) {
Person.call(this, name, age);//借用构造函数继承,继承属性
this.score = score;
}
Student.prototype = new Person();// 原型继承,继承方法
// Teacher的构造函数
function Teacher(name, age, salary) {
Person.call(this, name, age);
this.salary = salary;
}
Teacher.prototype = new Person();//原型继承,继承方法
Student.prototype.constructor = Student;//如果重新设置了原型对象,要重新设置里面的constructor
Teacher.prototype.constructor = Teacher;
var stu = new Student('zs', 34, 55);
var tea = new Teacher('ls', 33, 989);
console.log(stu);
console.log(tea);