JavaScript设计模式学习之路——继承
早在学习java的时候,就已经接触了继承,在java中因为有extends关键字,因此继承就比较简单。但是在JavaScript中,只能通过灵活的办法实现类的继承。
下面是我昨天在学习过程中,了解到的实现继承的一些方法,包括有具体的代码以及该方法的优缺点:
1.组合继承方式
原理:在子类的构造函数中,调用父类的构造函数,在子类原型上实例化父类,所以称为组合模式。
优点:融合了类式继承和构造函数继承的优点
缺点:父类构造函数调用了两次。第一次是使用构造函数时调用了父类的构造函数,第二次是实现子类原型的类式继承时又调用了一次。
/*
1.组合继承方式
缺点:在初始化时会调用两次构造函数
*/
var SuperClass = function(id,name){
this.id = id;
this.name = name;
this.books = ['javascript','html','css']; }
SuperClass.prototype.getName = function(){
return this.name; }
SuperClass.prototype.getId = function(){
return this.id; }
var SubClass = function(id,name,price){
SuperClass.call(this,id,name);
this.price = price; }
SubClass.prototype = new SuperClass();
SubClass.prototype.getPrice = function(){
return this.price; } //测试用例
var sub = new SubClass('001','css',25);
sub.books.push('internet');
console.log(sub.books);//["javascript", "html", "css", "internet"]
var father = new SuperClass('002','html');
console.log(father.books);// ["javascript", "html", "css"]
2、寄生式组合继承
原理:原型继承和构造函数继承组合,此方法是Douglas Crockford对寄生式继承的一个改造。
/**
*2.寄生式组合继承法
**/
function inheritObject(o){
function F(){};
F.prototype = o;
return new F();
}
/**
*1、继承设置
*传递参数:subclass子类
*传递参数:superclass父类
**/
function inheritPrototype(subClass,superClass){
//先将父类原型副本保持一份在变量中
var p = inheritObject(superClass.prototype);
p.constructor = subClass;
subClass.prototype = p; } var SuperClass = function(id,name){
this.id = id;
this.name = name;
this.books = ['javascript','html','css']; }
SuperClass.prototype.getName = function(){
return this.name; }
SuperClass.prototype.getId = function(){
return this.id; }
var SubClass = function(id,name,price){
SuperClass.call(this,id,name);
this.price = price; }
inheritPrototype(SubClass,SuperClass);
SubClass.prototype.getPrice = function(){
return this.price; } //测试用例
var sub = new SubClass('001','css',25);
sub.books.push('internet');
console.log(sub.books);//["javascript", "html", "css", "internet"]
var father = new SuperClass('002','html');
console.log(father.books);// ["javascript", "html", "css"]
console.log(SubClass.prototype instanceof SuperClass);//SubClass的实例才是SuperClass的一个实例,true
3、多重继承
原理:将所有的目标属性和方法复制,可带多个参数。
Object.prototype.mix = function(){
//复制属性和方法
var len = arguments.length;
for(var i = 0; i < len; i++){
var arg = arguments[i];
for(var property in arg){
this[property] = arg[property];
}
}
}
var Book = function(id,name){
this.id = id;
this.name = name;
}
var Image = function(url,size){
this.url = url;
this.size = size;
}
//测试用例
var book = new Book('001','javascript');
var image = new Image('http://baidu.com',52);
var imageBook = new Object();
var imageBook1 = new Object();
imageBook.mix(book,image);
imageBook1.mix(book,image);
imageBook1.name = "真的很不错";
console.log(imageBook);// Object { id="001", name="javascript", url="http://baidu.com", 更多...}
console.log(imageBook1);// Object { id="001", name="真的很不错", url="http://baidu.com", 更多...}
4、多态
原理:非常类似于java中的函数的重载,只不过加上了一些封装
例子:比如一个add()方法,无参数,返回0;一个参数,返回参数本身值+10;两个参数,返回两个参数值相加
//多态
var add = function(){
function zero(){
return 0;
}
function one(num){
return 10 + num;
}
function two(num1,num2){
return num1 + num2;
}
var arg = arguments;
var len = arg.length;
switch(len){
case 0 : return zero();
case 1 : return one(arg[0]);
case 2 : return two(arg[0],arg[1]);
}
}
console.log(add());//
console.log(add(5));//
console.log(add(2,18));//
到此,第二章的知识也就完毕了,迎来第三章。有错误的话,请大家留言指正哦~~
JavaScript设计模式学习之路——继承的更多相关文章
- JavaScript设计模式学习之路——面向对象的思想
今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...
- Javascript设计模式学习一
学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...
- JavaScript设计模式学习笔记
1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- javascript设计模式学习之十二——享元模式
一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...
- 设计模式学习之路——Decorator装饰模式(结构模式)
子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能:比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等. 动机 ...
- javascript设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
- javascript设计模式学习之十三——职责链模式
一.职责链的定义和使用场景 职责链模式的定义是,职责链模式将一系列可能会处理请求的对象连接成一条链,请求在这些对象之间一次传递,直到遇到一个可以处理它的对象.从而避免请求的发送者和接收者之间的耦合关系 ...
- javascript设计模式学习之十——组合模式
一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. ...
随机推荐
- docker环境下构建flannel 网络
flannel 是coreos 开发的网络解决方案,为每一台主机分配一个 subnet,容器从此subnet 中分配ip,ip可以在主机间路由.每个subnet从更大的ip池中划分,为了在各个主机间共 ...
- UART学习之路(一)基本概念
第一篇博客,首先记录一下这一个多星期来的学习内容. UART学习之路第一篇,是UART的基本概念介绍.后续会用STM32F103的串口与PC机通信.最后使用Verilog HDL写出串口发送模块和接收 ...
- 对Linux命令od -tc -tx1的C语言程序实现myod-优化版
导语 自编od C语言实现版名为myod 上个星期有一个初代版,链接- myod原版 这星期的课上要求实现myod-系统调用版本,要求如下 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...
- hasOwnProperty()函数
hasOwnProperty()函数的返回值为Boolean类型.如果对象object具有名称为propertyName的属性,则返回true,否则返回false 例子: function Site( ...
- BZOJ2140_稳定婚姻_KEY
题目传送门 暴力直接对于每个点跑一遍二分图匹配,能拿四十分. 然而我们考虑正解. 对于一对Couple我们建♂->♀的一条边,对于一对曾经有恋情的情侣我们建♀->♂的一条边. 跑Tarja ...
- OpenStack入门篇(二)之OpenStack架构
1.OpenStack 架构 中间菱形是虚拟机,围绕 VM 的那些长方形代表 OpenStack 不同的模块(OpenStack 叫服务,后面都用服务这个术语),下面来分别介绍. Nova:管理 VM ...
- MYSQL中日期与字符串间的相互转换
一.字符串转日期 下面将讲述如何在MYSQL中把一个字符串转换成日期: 背景:rq字段信息为:20100901 1.无需转换的: SELECT * FROM tairlist_day WHERE rq ...
- 【Unity3d】WWW类发起web连接
初学unity3d,解决一个游戏与web服务器连接问题. 看了项目中原始代码,发现每次之前的程序员每次调用WWW类都需要写一遍StartCoroutine,然后各种重复代码. 于是写了一个简单的封装类 ...
- [css 实践篇]CSS中的尺寸单位
绝对单位 px: Pixel 像素 pt: Points 磅 pc: Picas 派卡 in: Inches 英寸 mm: Millimeter 毫米 cm: Centimeter 厘米 q: Qua ...
- bilibili携手WeTest,保障视频类应用优质适配体验
WeTest 导读 中国移动视频用户规模越来越大,各类移动视频APP也百家争鸣, B站作为国内知名的年轻人文化社区,bilibili在推出移动端时,除了坚持自身的独特定位以外,对其APP的质量也十分重 ...