继承方法:
a. 原型链(prototype chaining)、
b.call()/apply()、
c.混合方式(prototype和call()/apply()结合)
d.对象冒充
// 1. prototype原型链方式:
function teacher(name){
this.name = name;
}
teacher.prototype.sayName=function(){
console.log('name is'+this.name)
}
var teacher1 = new teacher('xiaoming');
teacher1.sayName();
// name isxiaoming
function student(name){
this.name = name;
}
student.prototype=new teacher();
var student1 = new student('xiaolan');
student1 .sayName()
// name isxiaolan
// 2.call()/apply()方法
function teacher(name,age){
this.name = name;
this.age = age;
this.sayhi = function(){
console.log('name'+name+',age'+age)
}
}
function student(){
var args = arguments;
teacher.call(this, args[0], args[1]);
// teacher.apply(this,args)
}
var teacher1 = new teacher('xiaoming', 23)
teacher1.sayhi()
// namexiaoming,age23
var student1 = new student('xiaolan', 22)
student1.sayhi();
// namexiaolan,age22
// 3.混合方法[prototype, call()/apply()]
function teacher(name,age){
this.name = name;
this.age = age;
}
teacher.prototype.sayName = function(){
console.log('name:'+this.name)
}
teacher.prototype.sayAge = function(){
console.log('age:'+this.age)
}
function student(){
var args = arguments;
teacher.call(this, args[0], args[1])
}
student.prototype = new teacher();
var student1 = new student('xiaolan',23);
student1.sayName(); // name:xiaolan
student1.sayAge(); // age:23
// 4. 对象冒充
function Person(name, age){
this.name = name;
this.age = age;
this.show = function(){
console.log(this.name+','+this.age)
}
}
function Student(name, age){
this.student = Person; // 将Person类的构造函数赋值给this.student
this.student(name, age); // js中实际上是通过对象冒充来实现继承的
delete this.student; // 移除对Person的引用
}
var s = new Student('xiaoming',18)
s.show() // xiaoming,18
var p = new Person('xiaohua',17);
p.show() // xiaohua,17