浅析 JavaScript 组件编写
之前因项目需要也编写过一些简单的JS组件,大多是基于JQuery库的,一直也没有过总结,导致再次写到的时候还去Google, 近日看到一个文章总结的挺好,拿过整理一下做个备忘。
此次同样是基于jquery库来开发,根据一个例子来循序渐进地说明。
了解AngularJs的同学知道,其最具魅力的特点莫过于双向绑定,那么我们今天也来实现一个双向绑定的组件,在一个text文本框后面显示输入的文本内容。
<大概长这个模样>
1. 常规实现思路
<input id="txt-con" type="text" />
<script>
$(function(){
var textInput = $("#txt-con");
textInput.bind('keyup', function(){
if (textInput.val()) {
appendText(this, textInput.val());
}
}); var appendText = function(target, content) {
var id = target.id + "-present";
if ($("#" + id).length > 0) {
$("#" + id).text(content);
} else {
$(target).after("<h2 id='"+id+"'>"+content+"</h2>");
}
}
})
</script>
以上代码可以妥妥的跑,达到预期的目的。但是细心的你会发现,我们的完全没有考虑作用域的问题,appendText 方法被暴露在全局作用域里面,如果这一个页面中有几十上百个这样的全局变量,那维护起来会疯掉。
2. “隔离”作用域
我们现在对上面的代码进行一些修改,引入一个单独的命名空间。
var TextPresenter = {
init: function(id){
var textInput = $(id);
var self = this;
textInput.bind("keyup", function() {
if(textInput.val()) {
self.appendText(this, textInput.val()); //注意这里的self变量,是将TextPresenter对象的引用赋给了self
}
})
},
appendText: function(target, content){
var id = target.id + "-present";
if ($("#" + id).length > 0) {
$("#" + id).text(content);
} else {
$(target).after("<h2 id='"+id+"'>"+content+"</h2>");
}
},
} //以上部分你可以写进一个单独的js文件了,如jquery.textpresenter.js, 别忘了在document ready后初始化
$(function(){
TextPresenter.init("#txt-con");
})
以上部分有点组件的雏形了不是,很多时候就这样被拿来用了,如果你再细细一想,好像有哪里不对,因为 TextPresenter 里面的所有成员变量都可以在外部被访问,而没有一点私有化的概念在里面。所以,说是隔离其实并没有真正隔离,只是看起来像是隔离了。
3. 真正隔离作用域
说到作用域的隔离,我们不得不引入闭包的概念了。曾经看了多少遍闭包的概念,然而实际用到的机会少之又少。借此也来实践一下闭包的基础知识。
var TextPresenter = (function(){
var appendText = function(target, content) { //此方法成了私有化方法,外部不可直接访问
var id = target.id + "-present";
if ($("#" + id).length > 0) {
$("#" + id).text(content);
} else {
$(target).after("<h2 id='"+id+"'>"+content+"</h2>");
}
};
var TextPresenterFun = function() {
this.init = function(id) {
var textInput = $(id);
textInput.bind("keyup", function() {
if(textInput.val()) {
appendText(this, textInput.val());
}
})
}
};
return TextPresenterFun; //返回构造函数,在调用此组件时需要实例化,然后调用init方法
})();
new TextPresenter().init("#txt-con"); //调用的过程
这种方式可以创建必要的私有方法,对外开放的只有init方法,具体的内部逻辑并不对外开放,满足我所要求的隔离作用域的需求。事实上,大多数的jQuery组件都是这么实现的。
先写这么多吧,都是些基础,作为一个入门,要走的路还长着啊。
浅析 JavaScript 组件编写的更多相关文章
- JavaScript 组件编写
说明 这是一个联系人名过滤组件,还提供可选的"大小写是否敏感"选项,默认大小写不敏感. 一.HTML 结构 <ul class="contacts"> ...
- JavaScript手工编写滚动条组件
0 前言 上周的一个练习,由于没来得及编写笔记,这里补充一下~ 虽然CSS3中提供了overflow:scroll; 来实现滚动条,但是这里可以使用原生JS来编写一个,以达到练习组件编写的效果. 练习 ...
- 试试用有限状态机的思路来定义javascript组件
本文是一篇学习性的文章,学习利用有限状态机的思想来定义javascript组件的方法,欢迎阅读,后续计划会写几篇专门介绍自己利用有限状态机帮助自己编写组件的博客,证明这种思路对于编程实现的价值,目前正 ...
- Winjs – 微软开源技术发布的 JavaScript 组件集
Winjs 是由微软开源技术的开发者推出的一组 JavaScript 组件,包括 ListView.ListView.Tooltip.DatePicker.Ratings 等等,帮助 Web 开发人员 ...
- javascript组件化(转)
javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...
- javascript组件开发之基类继承实现
上一篇文章大概的介绍了一下关于javascript组件的开发方式,这篇文章主要详细记一下基类的编写,这个基类主要是实现继承的功能 为什么要封装基类? 由于这次重构项目需要对各种组件进行封装,并且这些组 ...
- (转)javascript组件开发方式
作为一名前端工程师,写组件的能力至关重要.虽然javascript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式. 下面我们来谈谈,在现有的知识体系下,如 ...
- [转] javascript组件开发方式
作为一名前端工程师,写组件的能力至关重要.虽然JavaScript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式. 下面我们来谈谈,在现有的知识体系下,如 ...
- javascript 组件化(转载)
这边只是很简陋的实现了类的继承机制.如果对类的实现有兴趣可以参考我另一篇文章javascript oo实现 我们看下使用方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
随机推荐
- 编写自己的javascript功能库之Ajax(仿jquery方式)
本人学习的是php,所以就用php跟js来演示代码了,主要是锻炼自己写js的能力,练练手而已. 下面这是我编写的操作ajax的代码功能,勉强让我称之为库吧.. js代码实例(tool.ajax.js) ...
- Nginx的安装及反向代理设置
因为项目的缘故,接触到了Nginx的安装和反向代理设置,和大家分享下. 一.Nginx的下载.安装cd /homewget http://nginx.org/download/nginx-1.0.5. ...
- python list内容拷贝方法
先看如下代码: x = ['a','b','z'] y = x print y y[0] = 'w' print x,y 结果输出: >>> ['a', 'b', 'z'] #y l ...
- iOS 9的 Universal Links 通用链接使用
前段时间和朋友(@品味生活)一起搞 iOS9的通用链接,我主要做了前面官方文档翻译工作,后面的一些东西都是他在搞,整理也是他整理的. 他的博客原文地址:http://pinwei.blog.51cto ...
- [UVALive] 6492 Welcome Party(最小点覆盖)
6492 Welcome Party For many summers, the Agile Crystal Mining company ran an internship program for ...
- 通过JCONSOLE监控TOMCAT的JVM使用情况
这个也是要学入一下,JVMr 虚拟机原理不可少. 参考配置URL“: http://blog.163.com/kangle0925@126/blog/static/277581982011527723 ...
- CH Round #53 -密室
描述 有N个密室,3种钥匙(红色,绿色,白色)和2种锁(红色,绿色),红色钥匙只能开红色的锁,绿色钥匙只能开绿色的锁,白色钥匙可以开红色的锁和绿 色的锁,一把钥匙使用一次之后会被扔掉.每个密室由一扇门 ...
- bzoj2325 [ZJOI2011]道馆之战
Description 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个 ...
- MYSQL中的语句
MYSQL中的语句 decimal(8,2):最多存10位数的数字,小数点后保存两位.如:999999.99
- socket用法以及tomcat静态动态页面的加载
一.套接字的使用: 分为以下几步: 1.创建ServerSocket 2.接收客户端的连接 3.读取本地的test.html文件 4.构建数据输出通道 5.发送数据 6.关闭资源 代码参考: pack ...