Js组件的一些写法


Posted in Javascript onSeptember 10, 2010

今天看了rank的一篇javascript脚本控件topic,突然想总结一下一些写JS组件的方法,或者说一些不同人的不同coding style。

首先看下Prototype里的写法:

var Class = { 
create: function() { 
return function() { this.init.apply(this, arguments); } 
} 
} 
var A = Class.create(); 
A.prototype = { 
init: function(msg) { 
this.msg = msg; 
}, 
fn: function() { 
alert(this.msg); 
} 
} 
var a = new A("myMsg"); 
a.fn();

如果你不喜欢上面这一大堆Class.create之类的,你也可以这样:
function A() { } //var A = function(){} 
A.prototype = { 
init: function(msg) { 
this.msg = msg; 
}, 
fn: function() { 
alert(this.msg); 
} 
} 
var a = new A(); 
a.init("myMsg"); 
a.fn();

当然,也可以把this.msg的初始化放到function A(msg){this.msg=msg;}里。总之你会发现这样调用很麻烦,并且参数是固定对应好的。

你如果既不愿搞一大堆Class.create,也不愿调用不方便,那就把Prototype里的var Class = {...} 和 var A = Class.create();合并起来。得到:

function A() { 
this.init.apply(this, arguments); 
} 
A.prototype = { 
init: function(msg) { 
this.msg = msg; 
}, 
fn: function() { 
alert(this.msg); 
} 
} 
var a = new A("myMsg"); 
a.fn();

看上去干净了许多,但是如果你的库里有很多组件,则每个组件都要写一遍this.init.apply(this, arguments); 如果用Class.create的话,则只要写一个Class,然后每个组件执行下Class.create()即可。当然,每个组件都写一遍this.init.apply(this, arguments);也没啥不好的,还是看个人喜好了。另外写原型方法是合在一起还是分开来写也是个人喜好,出于封装的角度,合一起好,但是分开有时候显的更清晰。譬如A.prototype.init=function(msg){...} A.prototype.fn=function(){...}

然后还有人喜欢这样去写组件:

var A = function(msg) { 
this.msg = msg; 
var _this = this; 
var privateFn1 = function() { 
alert(_this.msg); 
} 
var privateFn2 = function() { 
alert(_this.msg); 
} 
return { fn1: privateFn1, fn2: privateFn2 }; 
} 
var a = new A("myMsg"); 
a.fn1();

这边一定要把A构造的对象this放到临时变量_this中哦,因为运行时,privateFn1的函数体内this实际是{fn1:...,fn2:...}这样的匿名对象,你可以用this.hasOwnProperty("fn1")去测试。this是在运行时才有意义的一个东西。另外这种方法每个对象都会有privateFn1 和 privateFn2的副本,这种方法不太好。

(未完待续,下面会讲些不同框架的一些写法)
作者:JayChow

Javascript 相关文章推荐
Display SQL Server Login Mode
Jun 21 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
Aug 18 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
Jun 04 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
Dec 18 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
Oct 31 Javascript
react中使用css的7中方式(最全总结)
Feb 11 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
Apr 02 Javascript
使用localStorage替代cookie做本地存储
Sep 25 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 Javascript
编写Js代码要注意的几条规则
Sep 10 #Javascript
jquery之empty()与remove()区别说明
Sep 10 #Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 #Javascript
有趣的javascript数组定义方法
Sep 10 #Javascript
心扬JS分页函数代码
Sep 10 #Javascript
JavaScript中获取元素索引的函数
Sep 10 #Javascript
document.getElementById的简写方式(获取id对象的简略写法)
Sep 10 #Javascript
You might like
在PHP中使用灵巧的体系结构
2006/10/09 PHP
笑谈配置,使用Smarty技术
2007/01/04 PHP
浅析php原型模式
2014/11/25 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
JavaScript中的包装对象介绍
2015/01/27 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
新电JAVA笔试题目
2014/08/31 面试题
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
服装仓管员岗位职责
2014/06/17 职场文书
移交协议书
2014/08/19 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL