js作为一种弱类型语言,继承也是其较大的功能之一
首先定义一个父类
// 定义一个教师类function Teacher (name) { ?// 属性 ?this.name = name || ‘Jack‘; ?// 实例方法 ?this.study= function(){ ???console.log(this.name + ‘正在学习!‘); ?}}
一:继承的方式
1,原型链继承:将父类的实例作为子类的原型
function Student(){ }
Student
.prototype = new Teacher();
Student
.prototype.name = ‘john‘;
测试
var student = newStudent
();
console.log(student.name);
2,构造继承 (call,apply) 使用父类的构造函数来增强子类的实例,等同于复制父类的实例属性给子类
function Student(name) {
Teacher.call(this);
this.name = name || "Tom"
}
var student = new Student
();
console.log(student.name);
3,实例继承:为父类实例增加新特性作为子类实例返回
function Student(name){ ?var instance = new Teacher(); ?instance.name = name || ‘Tom‘; ?return instance;}// 测试var student = new Student();console.log(student.name);
4,拷贝继承
function Student(name){ ?var teacher= new Teacher(); ?for(var p in teacher){ ???Student.prototype[p] = Teacher[p]; ?} ?Student.prototype.name = name || ‘Tom‘;}// 测试var student= new Student();console.log(student.name);
5,组合继承 ?(通过调用父类的构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用
function Student(name){ ?Teacher.call(this); ?this.name = name || ‘Tom‘;}Student.prototype = new Teacher();// 测试var student = new Student();console.log(student.name);
6,寄生组合继承 通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点
function Student(name){ ?Teacher.call(this); ?this.name = name || ‘Tom‘;}(function(){ ?// 创建一个没有实例方法的类 ?var Super = function(){}; ?Super.prototype = Teacher.prototype; ?//将实例作为子类的原型 ?Student.prototype = new Super();})();// 测试var student = new Student();console.log(student.name);
js实现继承
原文地址:http://www.cnblogs.com/shmily-code/p/7808608.html