浅谈javascript继承【读javascript设计模式第四章节继承有感】

javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的

一:类似继承,先上关键代码

function extend(subClass,supClass){
  var fn = function(){};
  fn.prototype = supClass.prototype;
  subClass.prototype = new fn();
  subClass.prototype.constructor = subClass;
  subClass.supClass = supClass;           
  if(supClass.prototype.constructor == Object){
    supClass.prototype.constructor = supClass;
  }

}

首先通过代码可以看出这个是类与类的继承,通过把子类的prototype设置成new一个空的构造函数,改空的构造函数的prototype是父级类的prototype,好处是类与类之间的结构比较明确,

使用参考代码:

function FormField(){
  this.init.apply(this,arguments)
}
FormField.prototype = {
  init:function(){
    console.log("init");
    this.bind();
  },
  bind:function(){
    console.log("bind");
  }
};

function FormArea(){
  this.constructor.supClass.call(this);

};

extend(FormArea,FormField);
var formArea = new FormArea();

二:原型式继承,先上关键代码

function clone(obj){
  var fn = function(){};
  fn.prototype = obj;
  return new fn();

}

该方式优点是节约内存,无需上面那些类的各种指向,当前方式的有点恰巧也是他的缺点,改方式会共享他们的指针,特别是当指向的是一个对象或者数组的时候,得小心,clone出来的同事要重新复制替换掉之前的指向,另外同类式继承最大的区别,是类似继承是通过prototype = new XXX(某个父类),而原型是直接把prototype设置成一个字面量对象,

使用参考代码:

var formField = {

  init:function(){

  }

}

var formArea = clone(formField);

formArea.init();

三:渗元式,先上关键代码

function augment(receveClass,giveClass){
  if(arguments.length == 2){
    for(var i in giveClass.prototype){
      if(!receveClass.prototype[i]){
        receveClass.prototype[i] = giveClass.prototype[i]
        }
    }
  }else{
    var args = [].slice.call(arguments,2);
    for(var j=0, len=args.length; j<len; j++){
    if(!receveClass.prototype[args[j]]){
      receveClass.prototype[args[j]] = giveClass.prototype[args[j]];
      }
    }
  }
}

由于javascript是不能实现继承多个父类的,因为它就一个prototype,所以可以通过上面的方法去扩展prototype的方式去模拟继承多个父类的效果,

使用参考代码:

function Minx(){}
  Minx.prototype = {
  sayName:function(){
    p("sayName")
  },
  sayAge:function(){
    p(29);
  }
}       
function Person(){};
augment(Person,Minx,"sayName");
var p1 = new Person();
p1.sayName();

总结:

适应场合:方式一适合构造过程中需要传值去区分不同对象的情况,方式二适合带有很多默认属性,而大部分默认属性又都相同场合,且比较节约内存,方式三适合多个差异度很大的累,但是这些类里的某个方式又一样的场合下

浅谈javascript继承【读javascript设计模式第四章节继承有感】

时间: 2024-12-22 18:19:17

浅谈javascript继承【读javascript设计模式第四章节继承有感】的相关文章

浅谈javascript单体【读javascript设计模式第五章节单体有感】

单体,整个运行环境就独有一份,最简单的一种单体就是一个把所有属性和方法都集中在一起的对象,区别于一般的字面量对象,一般字面量对象是对一个物体的描述,集合该物体所具有的一些属性和方法,而单体则包含更多的些逻辑在里面,单体的好处有,划分命名空间,如果用来作为网页包装器,可以使得页面所有变量都封装在一个对象里,大幅度减小网页里的全局变量, 代码如: common.js (function(wz){ $.extend({ init:function(){ var self = this; this.bi

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色 本篇文章是系列文章中的第四篇,也是最后一篇,本篇文章需要前三篇的文章知识作为基础,前三篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会

浅谈href=#与href=javascript:void(0)的区别

#"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0)  仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首 而javascript:void(0) 则不是如此 所以调用脚本的时候最好用void(0) 或者<input onclick> <div onclick>等 打开新窗口链接的几种办法 1.window.open('url') 2.用自定义函数 <script>       

浅谈Supermap iClient for JavaScript 弹窗类

地图作为信息的载体和呈现方式,是GIS的重要组成部分,它是一个浏览信息的窗口,在信息日益发达的今天 ,各种地图应用如雨后春笋一般出现在大众眼前,而不是像以往一样太过局限于专业的领域.而弹窗,是作为地图信息的补充说明和描述的重要呈现方式,也广泛应用于各种地图应用中.一个好的前端界面的设计要灵活地使用空间,也要生动地完成与用户的交互,而在地图应用中,弹窗使用得好,不但会让人感觉舒适也会方便和增加与用户的交互,提升用户体验.如何使用和如何更好地使用iClient for JavaScript的弹窗(P

浅谈JS之text/javascript和application/javascript

问题描述: JS在IE8以下浏览器运行异常 代码: <script>标签是这样子写的: <script type="application/javascript"> //执行语句 </script> 这是书写的时候Dreamweaver自动补全的.但是在自己运行的例子中我的script标签写的是: <script type="text/javascript"> //执行语句 </script> 将项目中的标

浅谈源码的七大设计模式

本文会介绍一些经典的设计模式思想: 常用设计模式 Proxy代理模式 代理模式:为其他对象提供一种代理以便控制对这个对象的访问. 可以详细控制访问某个类(对象)的方法,在调用这个方法前作的前置处理(统一的流程代码放到代理中处理).调用这个方法后做后置处理. 代理模式分类: 1.静态代理(静态定义代理类,我们自己静态定义的代理类.比如我们自己定义一个明星的经纪人类) 2.动态代理(通过程序动态生成代理类,该代理类不是我们自己定义的.而是由程序自动生成)比较重要!! JDK自带的动态代理 javaa

浅谈小白如何读懂Redis高速缓存与持久化并存及主从高可用集群

一.简介 Redis是一个基于键值(K-V)的高速缓存软件,和他具有相同功能的软件有memcached,但其支持更为复杂的数据结构,例如:List,set,sorted set,同时redis具有持久性功能.redis究竟是什么?对于不同的应用场合,对redis的理解也不相同,如下有三种不同的理解. ①key value store(键值存储),是一个以键值形式存储的数据库,用来作为唯一的存储系统,同时借助于sentinel实现一定意义上的高可用. ②memory cached(内存缓存),是一

浅谈HDFS的读流程

1.使用HDFS提供的客户端Client,向远程的Namenode发起RPC请求: 2.Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址: 3.客户端Client会选取离客户端最近的DataNode来读取block:如果客户端本身就是DataNode,那么将从本地直接获取数据: 4.读取完当前block的数据后,关闭当前的DataNode链接,并为读取下一个block寻找最佳的DataNode: 5

浅谈JavaEE中的Hibernate中的四种关系映射(三)

今天我们一起来探讨一下有关Hibernate四种关系映射,大家可能会有疑惑,关系映射不就是只有三种(一对一,一对多,多对多)吗?这里我们再多说一个继承映射关系,虽然它使用频繁度没有前三个那么多,但是它在一些特定情况下,还是非常有用的,至于有什么用下面马上就要讲.这些关系映射实际上就是对应着关系型数据库中的几种关系的类型.我们都知道Hibernate的作用是将面向关系数据操作,转换成面向对象的操作,其中关系映射文件就是实现这个转换的核心.我们都知道如果我们仅仅使用SQL语句建表并且去维护表与表之间