Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:js中的类的继承, 无论再怎么设计 , 与经典的其它语言相比, 还是有自己特点 的, 不要硬套其它语言的思路
//父类
function Father(name, email, age) {
this.name = name;
this.email = email;
this.age = age;
}
//父类添加公共/原型方法
Father.prototype.getUser = function () {
return `我是${this.name},今年${this.age}岁,邮箱是:${this.email}`;
};
function Son(name, email, age) {
Father.call(this, name, email, age);
}
// 更新当前子类的原型对象,这样才能实现真正意义上继承
Son.prototype = Object.create(Father.prototype);
// 手工补上constructor
Son.prototype.constructor = Son;
// 实例化子类:
const son = new Son("peter", "peter@php.cn", 18);
// 使用子类访问getUser方法
console.log(son.getUser());
// 输出:我是peter,今年18岁,邮箱是:peter@php.cn
//父类
class Father {
//构造方法
constructor(name, email, age) {
this.name = name;
this.email = email;
this.age = age;
}
// 原型方法
getUser() {
return `我是${this.name},今年${this.age}岁,邮箱是:${this.email}`;
}
}
//子类
class Son extends Father {}
// 实例化子类:
const son = new Son("peter", "peter@php.cn", 18);
// 使用子类访问getUser方法
console.log(son.getUser());
// 输出:我是peter,今年18岁,邮箱是:peter@php.cn
//父类
function Father(name, email, age) {
this.name = name;
this.email = email;
this.age = age;
}
//父类添加公共/原型方法
Father.prototype.getUser = function () {
return `我是${this.name},今年${this.age}岁,邮箱是:${this.email}`;
};
//子类
function Son(name, email, age, lecturer) {
Father.call(this, name, email, age);
this.lecturer = lecturer;
}
// 更新当前子类的原型对象,这样才能实现真正意义上继承
Son.prototype = Object.create(Father.prototype);
// 手工补上constructor
Son.prototype.constructor = Son;
// 子类中重写父类的原型方法
Son.prototype.getUser = function () {
// return `我是${this.name},今年${this.age}岁,邮箱是:${this.email},职业: ${this.lecturer}`;
// .concat()连接多个字符串
return Father.prototype.getUser
.call(this)
.concat(`,职业: ${this.lecturer}`);
};
// 实例化子类:
const son = new Son("peter", "peter@php.cn", 18, "讲师");
// 使用子类访问getUser方法
console.log(son.getUser());
// 输出:我是peter,今年18岁,邮箱是:peter@php.cn,职业: 讲师
//父类
class Father {
//构造方法
constructor(name, email, age) {
this.name = name;
this.email = email;
this.age = age;
}
// 原型方法
getUser() {
return `我是${this.name},今年${this.age}岁,邮箱是:${this.email}`;
}
}
//子类
class Son extends Father {
constructor(name, email, age, lecturer) {
// 调用父类的构造方法
// super()必须是第一条,否则不能正确的生成子类的this
super(name, email, age);
this.lecturer = lecturer;
}
// 子类中重写父类的原型方法
getUser() {
// return `我是${this.name},今年${this.age}岁,邮箱是:${this.email},职业: ${this.lecturer}`;
// .concat()连接多个字符串
return super.getUser().concat(`,职业: ${this.lecturer}`);
}
}
// 实例化子类:
const son = new Son("peter", "peter@php.cn", 18,"讲师");
// 使用子类访问getUser方法
console.log(son.getUser());
// 输出:我是peter,今年18岁,邮箱是:peter@php.cn,职业: 讲师
prototype
属性将this
指针指向父类的原型方法,也就是调用方法时当本类找不到会逐级向上查找,也就是所谓的原型链(不知道理解是否正确?)