let student1 = newStudent('张三', 18, '一年级'); //实例化对象
//继承父类的实例方法 student1.run(); //张三 is running //不可继承父类的原型方法 //student1.swim(); //TypeError: student1.swim is not a function //不可继承父类的静态方法 //Student.work(); //TypeError: Student.work is not a function
原型链继承
首先建一个空的子类,将父类的实例赋给子类的 prototype 属性。
1 2 3
functionTeacher(name, age, subject) {}
Teacher.prototype = newPerson(); //原型链继承
实例化一个对象,发现可以使用父类的实例方法和原型方法,但 new 实例化传参不可用,需要手动修改实例属性。同时静态方法也不能被继承。
1 2 3 4 5 6 7 8 9 10 11 12
let teacher1 = newTeacher('李四', 30, '语文');//实例化对象
//实例属性存在但是没有初始化 teacher1.run(); //undefined is running teacher1.swim(); //undefined is swiming //修改实例属性 teacher1.name = "王五"; teacher1.run(); //王五 is running teacher1.swim(); //王五 is swiming
//不可继承父类的静态方法 //Teacher.work(); //TypeError: Teacher.work is not a function
对象冒充+原型链继承
新建一个子类,通过结合两者实现继承。
1 2 3 4 5 6 7 8 9
functionProgrammer(name, age, language) { Person.call(this, name, age); //对象冒充继承 this.language = language; //实例属性 this.introduce = function () { //实例方法 console.log(`${this.name} is a ${this.language} developer`); } }
let programmer1 = newProgrammer('赵六', 35, 'JavaScript');//实例化对象
//继承父类的实例方法 programmer1.run(); //赵六 is running //子类方法使用父类的实例属性 programmer1.introduce(); //赵六 is a JavaScript developer //继承父类的原型方法 programmer1.swim(); //赵六 is swiming
//不可继承父类的静态方法 Programmer.work(); //TypeError: Programmer.work is not a function
ES6
ES6 为类的继承提供了好用的语法糖。
在 class 内,使用 constructor 创建实例属性,用函数创建实例方法,还可以用 static 表示其是静态属性或方法。