javascript 高级编程系列 - 继承
1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数)
// 定义父类构造函数
function SuperClass(father, mother){
this.father = father;
this.mother = mother;
this.brothers = ['jack', 'mike'];
}
// 给父类中添加方法
SuperClass.prototype.getFather = function(){
return this.father;
} // 定义子类构造函数
function SubClass(name, age){
this.name = name;
this.age = age;
}
// 继承父类
SubClass.prototype = new SuperClass('perter','nancy'); // 添加新方法
SubClass.prototype.getName = function(){
return this.name;
};
// 重写父类中的方法
SubClass.prototype.getFather = function(){
return null;
} // 实例化子类
var obj = new SubClass('leon', 30);
2. 借用构造函数继承(优点:子类继承的数据不会共享,可以在实例化子类时对父类进行传参;缺点:方法需要在构造函数中定义,以及重写)
// 定义父类构造函数
function SuperClass(father, mother){
this.father = father;
this.mother = mother;
this.brothers = ['jack', 'mike'];
this.getFather = function(){ // 需要子类继承的方法一定得在构造函数中定义
return this.father;
}
} // 定义子类构造函数, 并调用父构造函数实现继承
function SubClass(name, age,father, mother){
SuperClass.call(this, father, mother);
this.name = name;
this.age = age;
this.getFather = function(){ // 只能在构造函数中重写父类中的方法
return null;
}
}
// 添加新方法
SubClass.prototype.getName = function(){
return this.name;
}; // 实例化子类
var obj = new SubClass('leon', 30, 'peter', 'nancy');
3. 组合继承 (融合原型链继承与借用构造函数继承)
// 定义父类构造函数
function SuperClass(father, mother){
this.father = father;
this.mother = mother;
this.brothers = ['jack', 'mike'];
}
// 添加父类方法
SuperClass.prototype.getFather = function(){
return this.father;
}; // 定义子类构造函数, 并调用父构造函数实现属性继承
function SubClass(name, age,father, mother){
SuperClass.call(this, father, mother);
this.name = name;
this.age = age;
} // 通过实例化父类作为子类原型对象,实现方法继承
SubClass.prototype = new SuperClass();
SubClass.prototype.constructor = SubClass; // 添加新方法
SubClass.prototype.getName = function(){
return this.name;
};
// 重写父类中的方法
SubClass.prototype.getFather = function(){
return null;
}; // 实例化子类
var obj = new SubClass('leon', 30, 'peter', 'nancy');
4. 原型式继承 (基于一个给定的对象,创建一个相似的对象, 相当于es5中的Object.create() 方法)
// 实现继承的函数
function object(o){
function F(){}
F.prototype = o;
return new F();
} // 定义基础对象
var baseObj = {
name: 'john',
age: 20,
getName: function(){
return this.name;
}
} // 创建新对象
var newObj = object( baseObj);
newObj.name = 'leon';
newObj.getName();
5. 寄生式继承 (封装原型式继承,并为新创建对象添加新的属性和方法,缺点:新添加的方法无法共享)
// 实现继承的函数
function object(o){
function F(){}
F.prototype = o;
return new F();
} // 封装继承过程的函数
function createObj(obj){
var newObj = object(obj);
newObj.getAge = function(){
return this.age;
}
return newObj;
} // 定义基础对象
var baseObj = {
name: 'john',
age: 20,
getName: function(){
return this.name;
}
} // 创建新对象
var obj = createObj( baseObj);
obj.name = 'leon';
obj.getName();
obj.getAge();
6. 寄生组合式继承 (改进组合式继承,将原型方法的继承改为利用寄生式继承的方法进行继承,避免了在prototype上产生不必想的属性值,以及多次调用父类构造函数的情况)
// 定义父类构造函数
function SuperClass(father, mother){
this.father = father;
this.mother = mother;
this.brothers = ['jack', 'mike'];
}
// 添加父类方法
SuperClass.prototype.getFather = function(){
return this.father;
}; // 定义子类构造函数, 并调用父构造函数实现属性继承
function SubClass(name, age,father, mother){
SuperClass.call(this, father, mother);
this.name = name;
this.age = age;
} // 继承原型的函数
function inheritPrototype(SubClass, SuperClass){
var prototype = object(SuperClass.prototype);
prototype.constructor = SubClass;
SubClass.prototype = prototype;
} // 通过调用原型继承函数,实现方法继承
inheritPrototype(SubClass, SuperClass); // 添加新方法
SubClass.prototype.getName = function(){
return this.name;
}; // 重写父类中的方法
SubClass.prototype.getFather = function(){
return null;
}; // 实例化子类
var obj = new SubClass('leon', 30, 'peter', 'nancy');
javascript 高级编程系列 - 继承的更多相关文章
- javascript 高级编程系列 - 函数
一.函数创建 1. 函数声明 (出现在全局作用域,或局部作用域) function add (a, b) { return a + b; } function add(a, b) { return a ...
- javascript 高级编程系列 - 基本数据类型
javascript中的基本数据类型包括: Undefined, Null, Boolean, Number, String 5种数据类型 1. Undefined 类型 (只有一个值 undefin ...
- javascript 高级编程系列 - 创建对象
1. 工厂模式 function createPerson(name, age) { var obj = {}; obj.name = name; obj.age = age; obj.getName ...
- javascript高级编程笔记01(基本概念)
1.在html中使用JavaScript 1. <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...
- JavaScript高级编程———JSON
JavaScript高级编程———JSON < script > /*JSON的语法可以表达一下三种类型的值 简单值:使用与javas相同的语法,可以在JSON中表达字符串.数值.布尔值和 ...
- JavaScript高级编程———基本包装类型String和单体内置对象Math
JavaScript高级编程———基本包装类型和单体内置对象 <script> var stringObject = new String("hello world") ...
- JavaScript高级编程——Date类型
JavaScript高级编程——Date类型 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...
- JavaScript高级编程——Array数组迭代(every()、filter()、foreach()、map()、some(),归并(reduce() 和reduceRight() ))
JavaScript高级编程——Array数组迭代(every().filter().foreach().map().some(),归并(reduce() 和reduceRight() )) < ...
- JavaScript高级编程——引用类型、Array数组使用、栈方法
JavaScript高级编程——引用类型.Array数组使用.栈方法 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...
随机推荐
- Welcome-to-Swift-19类型嵌套(Nested Types)
枚举类型常被用于实现特定类或结构体的功能.也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义类型嵌套,可以在枚举类型.类和结构体中定义支持嵌套的类型 ...
- 前端CSS规范大全(转)
一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...
- (转)关于Jackson2.x中com.fasterxml.jackson包的用法
Jackson应该是目前最好的json解析工具了,之前一直用的是org.codehaus.jackson包中的工具,使用的 包是jackson-all-1.9.11.jar. 最近发现Jackson升 ...
- [转] Makefile 基础 (8) —— Makefile 隐含规则
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- bzoj 2794 [Poi2012]Cloakroom 离线+背包
题目大意 有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i]). 再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得: 对于每个选 ...
- 我要好offer之 C++大总结
0. Google C++编程规范 英文版:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml 中文版:http://zh-g ...
- es6总结(七)--proxy & reflect
- 转 Django+Bootstrap练习--我的类博客系统开发
转自: http://blog.sina.com.cn/s/blog_7e050dc80102w312.html 本文记录了一个类博客网站从无到有的搭建过程,同时也是我入门django以及再次入门前端 ...
- Yii使用find findAll查找出指定字段的实现方法
Yii使用find findAll查找出指定字段的实现方法,非常实用的技巧,需要的朋友可以参考下. 用过Yii的朋友都知道,采用如下方法: 查看代码 打印 1 modelName::model() ...
- toUpperCase与toLowerCase
public String toLowerCase()此方法返回的字符串转换为小写. public String toUpperCase()此方法返回的字符串转换为大写. 注:支队英文字符有效,其他字 ...