function Animal (name) {
this.name = name || "动物"
this.type = "Animal 类"
this.sleep = function () {
console.log(this.name +'正在睡觉!')
}
}
Animal.prototype.eat = function (food) {
console.log(this.name +'正在吃:'+ food);
}
// 子类
function Cat (name) {
this.name = name
}
// 原型继承
Cat.prototype = new Animal()
Cat.prototype.constructor = Cat
const cat = new Cat("加菲猫")
console.log(cat.type) // Animal 类
console.log(cat.name) // 加菲猫
console.log(cat.sleep()) // 加菲猫正在睡觉!
console.log(cat.eat('火腿肠')) // 加菲猫正在吃:火腿肠
/* 说明:
在子类Cat中,我们增加了name属性,在生成子类Cat的实例时,name属性值会覆盖父类Animal的name属性值,因此输出字符串“加菲猫”,而并不会输出父类Animal的name属性“动物”。
原型链继承的优点:
1.简单,易于实现, 只需要设置子类的prototype属性为父类的实例即可,实现起来简单。
2.继承关系纯粹; 生成的实例既是子类的实例,也是父类的实例。
3.可通过子类直接访问父类原型链属性和函数
原型链继承的缺点:
1.子类的所有实例将共享父类的属性
2.在创建子类实例时,无法向父类的构造函数传递参数
3.无法实现多继承
4.为子类增加原型对象上的属性和函数时,必须放在new Animal()函数之后
*/
console