继承
什么是继承
- 现实生活中的继承
- 程序中的继承
对象的继承
// 继承演示(对象的继承)
function extend(child, parent) {
for (var key in parent) {
if (child[key]) continue; // 如果child中有该成员,不替换成parent对象中的成员
child[key] = parent[key];
}
}
var parent = {
name: '王',
age: 60,
house: '别墅',
money: 1000000,
car: '玛莎拉蒂',
play: function () {
console.log('弹吉他');
}
};
var child = {
name: 'jack',
age: 18
};
// 把parent对象的所有成员 拷贝到 child对象上 (实现继承)
extend(child, parent);
原型继承
// 1 原型继承
function Super() {
this.color = 'red';
}
function Sub() {
}
Sub.prototype = new Super();
Sub.prototype.constructor = Super;
var sub = new Sub();
console.log(sub.color);
//原型继承的问题:无法给构造函数传参
构造函数的属性继承:借用构造函数
function Person (name, age) {
this.type = 'human'
this.name = name
this.age = age
}
function Student (name, age) {
// 借用构造函数继承属性成员
Person.call(this, name, age)
}
var s1 = Student('张三', 18)
console.log(s1.type, s1.name, s1.age) // =>human 张三 18
借用构造函数继承问题:无法重用方法
组合式继承
// 结合原型继承和组合式继承
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.sayHi = function () {
console.log(this.name);
}
function Student(name, age, sex, score) {
Person.call(this, name, age, sex);
this.score = score;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;
var stu = new Student('feng', 18, '男', 100);
console.log(stu);
构造函数的原型方法继承:拷贝继承(for-in)
function Person (name, age) {
this.type = 'human'
this.name = name
this.age = age
}
Person.prototype.sayName = function () {
console.log('hello ' + this.name)
}
function Student (name, age) {
Person.call(this, name, age)
}
// 原型对象拷贝继承原型对象成员
for(var key in Person.prototype) {
Student.prototype[key] = Person.prototype[key]
}
var s1 = Student('张三', 18)
s1.sayName() // => hello 张三
另一种继承方式:原型继承
function Person (name, age) {
this.type = 'human'
this.name = name
this.age = age
}
Person.prototype.sayName = function () {
console.log('hello ' + this.name)
}
function Student (name, age) {
Person.call(this, name, age)
}
// 利用原型的特性实现继承
Student.prototype = new Person()
var s1 = Student('张三', 18)
console.log(s1.type) // =>human
s1.sayName() // =>hello 张三