• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 基于javascript的组件开发方式

基于javascript的组件开发方式

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5教程,HTML5中国,基于javascript的组件开发方式,html5cn,html5资料,html5文章,等相关知识,匿名希望在学习及工作中可以帮助到您
  作为一名前端工程师,写组件的能力至关重要。虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式。

  下面我们来谈谈,在现有的知识体系下,如何很好的写组件。

  比如我们要实现这样一个组件,就是一个输入框里面字数的计数。这个应该是个很简单的需求。


  

  我们来看看,下面的各种写法。

  为了更清楚的演示,下面全部使用jQuery作为基础语言库。



  最简陋的写法

  嗯 所谓的入门级写法呢,就是完完全全的全局函数全局变量的写法。(就我所知,现在好多外包还是这种写法)

  代码如下:


test

  

  这段代码跑也是可以跑的,但是呢,各种变量混乱,没有很好的隔离作用域,当页面变的复杂的时候,会很难去维护。目前这种代码基本是用不了的。当然少数的活动页面可以简单用用。


  作用域隔离

  让我们对上面的代码作些改动,使用单个变量模拟命名空间。


var textCount = { input:null, init:function(config){ this.input = $(config.id); this.bind(); //这边范围对应的对象,可以实现链式调用 return this; }, bind:function(){ var self = this; this.input.on('keyup',function(){ self.render(); }); }, getNum:function(){ return this.input.val().length; }, //渲染元素 render:function(){ var num = this.getNum(); if ($('#J_input_count').length == 0) { this.input.after(''); }; $('#J_input_count').html(num+'个字'); } } $(function() { //在domready后调用 textCount.init({id:'#J_input'}).render(); })

  

  这样一改造,立马变的清晰了很多,所有的功能都在一个变量下面。代码更清晰,并且有统一的入口调用方法。

  但是还是有些瑕疵,这种写法没有私有的概念,比如上面的getNum,bind应该都是私有的方法。但是其他代码可以很随意的改动这些。当代码量特别特别多的时候,很容易出现变量重复,或被修改的问题。

  于是又出现了一种函数闭包的写法:


var TextCount = (function(){ //私有方法,外面将访问不到 var _bind = function(that){ that.input.on('keyup',function(){ that.render(); }); } var _getNum = function(that){ return that.input.val().length; } var TextCountFun = function(config){ } TextCountFun.prototype.init = function(config) { this.input = $(config.id); _bind(this); return this; }; TextCountFun.prototype.render = function() { var num = _getNum(this); if ($('#J_input_count').length == 0) { this.input.after(''); }; $('#J_input_count').html(num+'个字'); }; //返回构造函数 return TextCountFun; })(); $(function() { new TextCount().init({id:'#J_input'}).render(); })

  

  这种写法,把所有的东西都包在了一个自动执行的闭包里面,所以不会受到外面的影响,并且只对外公开了TextCountFun构造函数,生成的对象只能访问到init,render方法。这种写法已经满足绝大多数的需求了。事实上大部分的jQuery插件都是这种写法。


  面向对象

  上面的写法已经可以满足绝大多数需求了。

  但是呢,当一个页面特别复杂,当我们需要的组件越来越多,当我们需要做一套组件。仅仅用这个就不行了。首先的问题就是,这种写法太灵活了,写单个组件还可以。如果我们需要做一套风格相近的组件,而且是多个人同时在写。那真的是噩梦。

  在编程的圈子里,面向对象一直是被认为最佳的编写代码方式。比如java,就是因为把面向对象发挥到了极致,所以多个人写出来的代码都很接近,维护也很方便。但是很不幸的是,javascript不支持class类的定义。但是我们可以模拟。

  下面我们先实现个简单的javascript类:


var Class = (function() { var _mix = function(r, s) { for (var p in s) { if (s.hasOwnProperty(p)) { r[p] = s[p] } } } var _extend = function() { //开关 用来使生成原型时,不调用真正的构成流程init this.initPrototype = true var prototype = new this() this.initPrototype = false var items = Array.prototype.slice.call(arguments) || [] var item //支持混入多个属性,并且支持{}也支持 Function while (item = items.shift()) { _mix(prototype, item.prototype || item) } // 这边是返回的类,其实就是我们返回的子类 function SubClass() { if (!SubClass.initPrototype && this.init) this.init.apply(this, arguments)//调用init真正的构造函数 } // 赋值原型链,完成继承 SubClass.prototype = prototype // 改变constructor引用 SubClass.prototype.constructor = SubClass // 为子类也添加extend方法 SubClass.extend = _extend return SubClass } //超级父类 var Class = function() {} //为超级父类添加extend方法 Class.extend = _extend return Class })()

  

  这是拿John Resig的class简单修改了下。

  我们看下使用方法:


//继承超级父类,生成个子类Animal,并且混入一些方法。这些方法会到Animal的原型上。 //另外这边不仅支持混入{},还支持混入Function var Animal = Class.extend({ init:function(opts){ this.msg = opts.msg this.type = "animal" }, say:function(){ alert(this.msg+":i am a "+this.type) } }) //继承Animal,并且混入一些方法 var Dog = Animal.extend({ init:function(opts){ //并未实现super方法,直接简单使用父类原型调用即可 Animal.prototype.init.call(this,opts) //修改了type类型 this.type = "dog" } }) //new Animal({msg:'hello'}).say() new Dog({msg:'hi'}).say()

  

  使用很简单,超级父类具有extend方法,可以继承出一个子类。子类也具有extend方法。

  这边要强调的是,继承的父类都是一个也就是单继承。但是可以通过extend实现多重混入。详见下面用法。

  有了这个类的扩展,我们可以这么编写代码了:


var TextCount = Class.extend({ init:function(config){ this.input = $(config.id); this._bind(); this.render(); }, render:function() { var num = this._getNum(); if ($('#J_input_count').length == 0) { this.

您可能想查找下面的文章:

  • 一款利用html5和css3动画排列人物头像的实例演示
  • html5教程调用绘图api画简单的圆形代码分享
  • html5教程画矩形代码分享
  • html5教程制作简单画板代码分享
  • html5基础教程常用技巧整理
  • html5教程-Canvas入门
  • html5教程画矩形代码分享
  • HTML5晃动DeviceMotionEvent事件
  • HTML5教程之html 5 本地数据库(Web Sql Database)
  • HTML5中对contenteditable属性的解释与规定

相关文章

  • 2018-12-03HTML5中新事件的详细介绍
  • 2017-08-06html5 postMessage解决跨域、跨窗口消息传递方案
  • 2018-12-03 html5应用缓存与Web Workers的图文详解
  • 2018-12-03HTML5加载时的等待动画效果制作
  • 2018-12-03HTML5 web存储-web SQL示例代码分析
  • 2017-08-06HTML5 MiranaVideo播放器 (代码开源)
  • 2018-12-03同事开发webapp(图片应用)遇到一些问题,如兼容uc浏览器,那么webapp开发在业内有没有比较成功的例子?
  • 2017-08-06HTML5不支持标签和新增标签详解
  • 2018-12-03Canvas如何做出3D动态的Chart图表
  • 2018-12-03HTML5 Canvas基本线条绘制的实例教程_html5教程技巧

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • 断点续传原理是什么?怎么利用html5实现文件断点续传
    • HTML5 Canvas 起步(1) - 基本概念_html5教程技巧
    • Html5 Canvas初探学习笔记(3) -绘制样式和绘制文本
    • iOS webView怎样加载HTMLString
    • HTML5的新特性(1)
    • canvas绘制各种基本图形
    • HTML5边玩边学(二)-基础绘图
    • 使用HTML5 Canvas绘制阴影效果的方法
    • css3 transform 3d 使用css3创建动态3d立方体(html5实践)_html5教程技巧
    • 涂鸦板简单实现 Html5编写属于自己的画画板

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有