// 寄生组合式继承,最理想的继承方法
function inheritPrototype(sub, super) { //sub是子函数,super是父函数,sub继承super
var prototype = Object.create(super.prototype); // 创建对象,父原型的副本
prototype.constructor = sub; // 增强对象 把创建出来的父对象副本的构造器指向子函数
sub.prototype = prototype; // 修改子函数的原型
}
function staff() { //创建父构造函数
this.company = "ABC";
this.test = [1, 2, 3];
}
staff.prototype.companyName = function () { //添加父构造函数的原型方法
return this.company;
}
function employee(name, profession) { //创建子构造函数
staff.call(this, name); //子构造函数强制调用父构造函数的属性
this.employeeName = name;
this.profession = profession;
}
// 将父类原型指向子类
inheritPrototype(employee, staff) //子继承父的原型对象并增强
let instanceOne = new employee("Andy", "A");
let instanceTwo = new employee("Rose", "B");
instanceOne.test.push(4);
// 测试
console.log(instanceTwo.test); // [1,2,3]
console.log(instanceOne.companyName()); // ABC
// 通过 hasOwnProperty() 方法来确定自身属性与其原型属性
console.log(instanceOne.hasOwnProperty('test')) // true
// 通过 isPrototypeOf() 方法来确定原型和实例的关系
console.log(staff.prototype.isPrototypeOf(instanceOne)); // true
// ES6 class继承
class Father{
constructor(name,age){
this.name=name;
this.age = age;
}
sayHi(){
console.log("我的名字叫:"+this.name,"我是父对象的sayHi方法");
}
}
let f = new Father("爸爸",48);
// 创建子类构造函数并继承Father
class Child extends Father{
constructor(name,age,money){
super(name,age);
this.money = money;
}
sayHi(){
super.sayHi();
console.log("我的名字叫:"+this.name,"我是子对象的sayHi方法");
}
showMoney(){
console.log("我是儿子,我有钱:"+this.money);
}
}
let c = new Child("儿子",24,1000000);
console.dir(c);
c.showMoney();
c.sayHi();