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 ...
随机推荐
- 从输入url到页面呈现的过程
从输入url到页面呈现的过程包括两个基本过程:网络通信和页面渲染 网络通信主要过程是 域名解析 -> TCP连接 -> HTTP请求 -> 服务端响应,返回HTML 页面渲染的主要过 ...
- 刷题总结——Bob's Race(hdu4123 树形dp+st表)
题目: Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the ro ...
- Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!
因为Axis2同时支持SOAP和RESTful的WebService开发. 我的目标主要是RESTful,这里简单记录一个SOAP的小例子: 原文地址:https://jingyan.baidu.co ...
- SyntaxError: Non-UTF-8 code starting with '\xb4'...
需在开头指定编码格式,在在最开头添加如下代码: # -*- coding: gb2312 -*- 大功告成!
- 代码动态改变 NGUI UILabel 的字体
有一次因为 ttf 分成简体和繁体两个..所以就需要动态改变NGUI 中 UILabel 的字体,但是不知道 UILabel 保存字体的字段是哪个 网上搜到..在这里记录一下 using UnityE ...
- 【BZOJ2243】染色(树链剖分)
题意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由 ...
- 【NOIP2016练习】T1 string (计数)
题意: 思路: ; ..]of int64; n,k,i:longint; ans,x,y:int64; s,t:ansistring; function c(x,y:longint):int64; ...
- 视音频数据处理入门:RGB、YUV像素数据处理【转】
转自:http://blog.csdn.net/leixiaohua1020/article/details/50534150 ==================================== ...
- python常用模块2
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- HDU 5733 tetrahedron(计算几何)
题目链接 tetrahedron 题目大意 输入一个四面体求其内心,若不存在内心则输出"O O O O" 解题思路 其实这道题思路很简单,只要类推一下三角形内心公式就可以了. 至于 ...