Javascript基于OOP实实现探测器功能代码实例


Posted in Javascript onAugust 26, 2020

代码如下

<script>
/*所有探测器都有探测的方法和分析的方法,分析当前的浏览器环境,不管是浏览器还是nodejs*/
/*container容器探测器*/
/*link链接探测器*/

/*外层用一个立即执行的匿名函数包裹住,防止一些函数声明或者变量泄露到外面*/

!function(global){
  function DetectorBase(configs){//不让外部通过直接调用方式调用,必须使用new,不使用new就会报错
    /*使用new的话,this就是最后要返回的对象,this instanceof DetectorBase应该返回true,不是的话说明没有直接通过new调用*/
    if(!this instanceof DetectorBase){/**/
      throw new Error('Do not invoke without new.');
    }
    this.configs=configs;/*所有的探测器都会有config属性*/
    this.analyze();/*所有的探测器初始化的时候都需要解析一下数据*/

  }

  DetectorBase.prototype.detect=function(){/*代表一个抽象的探测方法,基类不是具体的一个探测器所以实现没有意义,用来说明需要实现这样一个方法*/
    throw new Error('Not implemented');
  }

  DetectorBase.prototype.analyze=function(){
    console.log('analyzing...');
    this.data="###data###";
  }

  /***具体实例***/
  function LinkDetector(links){/*链接探测器,同理必须通过new来构造*/
    DetectorBase.apply(this,arguments);
    if(!this instanceof LinkDetector){
      throw new Error('Do not invoke without new.');
    }
    this.links=links;

  }

  function ContainerDetector(containers){
    DetectorBase.apply(this,arguments);
    if(!this instanceof ContainerDetector){
      throw new Error('Do not invoke without new.');
    }
    this.containers=containers;
  }
  //inherit first
  /*LinkDetector和ContainerDetector都可能挂载一些自己的方法
  需要注意,一定要先实现原型链的继承,再去扩展。
  因为继承的时候要改写LinkDetector的prototype属性*/
  inherit(LinkDetector,DetectorBase);
  inherit(ContainerDetector,DetectorBase);

  //expand later
  LinkDetector.prototype.detect=function(){
    console.log('Loading data:'+this.data);
    console.log('Link detection started.');
    console.log('Scaning links:'+this.links);
  }

  ContainerDetector.prototype.detect=function(){
    console.log('Loading data:'+this.data);
    console.log('Container detection started.');
    console.log('Scaning containers:'+this.containers);
  }

  //prevent from being altered
  /*不希望监控程序被改写,不可删,不可扩展,不可写*/
  Object.freeze(DetectorBase);
  Object.freeze(DetectorBase.prototype);
  Object.freeze(LinkDetector);
  Object.freeze(LinkDetector.prototype);
  Object.freeze(ContainerDetector);
  Object.freeze(ContainerDetector.prototype);



  //export to global object
  /*通过defineProperties一次性把3个类暴露在外面,同时保护它们不可被枚举,不可被删除和改写*/
  Object.defineProperties(global,{
    LinkDetector:{value:LinkDetector},
    ContainerDetector:{value:ContainerDetector},
    DetectorBase:{value:DetectorBase}
  });


  function inherit(subClass,superClass){//
    subClass.prototype=Object.create(superClass.prototype);
    subClass.prototype.constructor=subClass;
  }

}(this);

var cd=new ContainerDetector('#abc #def #ghi');
var ld=new LinkDetector('http://www.taobao.com http://www.tmall.com http://www.baidu.com');
cd.detect();
ld.detect();

</script>

运行结果

Javascript基于OOP实实现探测器功能代码实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
CSS常用网站布局实例
Apr 03 Javascript
[Web]防止用户复制页面内容和另存页面的方法
Feb 06 Javascript
jQuery 页面载入进度条实现代码
Feb 08 Javascript
基于mootools 1.3框架下的图片滑动效果代码
Apr 22 Javascript
基于jquery库的tab新形式使用
Nov 16 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
js中string和number类型互转换技巧(分享)
Nov 28 Javascript
Bootstrap模态框插件使用详解
May 11 Javascript
全面解析Node.js 8 重要功能和修复
Jun 02 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
js实现录音上传功能
Nov 22 Javascript
vue iview实现动态新增和删除
Jun 17 Javascript
Javascript如何实现扩充基本类型
Aug 26 #Javascript
Javascript var变量删除原理及实现
Aug 26 #Javascript
js实现车辆管理系统
Aug 26 #Javascript
js实现飞机大战小游戏
Aug 26 #Javascript
JS面向对象实现飞机大战
Aug 26 #Javascript
JavaScript Image对象实现原理实例解析
Aug 26 #Javascript
js实现飞机大战游戏
Aug 26 #Javascript
You might like
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
jQuery live
2009/05/15 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
token 机制和实现方式
2020/12/15 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
python打包成so文件过程解析
2019/09/28 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
django使用graphql的实例
2020/09/02 Python
python 写一个水果忍者游戏
2021/01/13 Python
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
宿舍使用违章电器检讨书
2014/01/12 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
高中物理教学反思
2016/02/19 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
Elasticsearch 索引操作和增删改查
2022/04/19 Python