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 相关文章推荐
JScript中的undefined和"undefined"的区别
Mar 08 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
js动态调用css属性的小规律及实例说明
Dec 28 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
Js实现网页键盘控制翻页的方法
Oct 30 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
Dec 07 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
js中遍历Map对象的简单实例
Aug 08 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
Apr 11 jQuery
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
Dec 28 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 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/11/24 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
php中yii框架实例用法
2020/12/22 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
Python-基础-入门 简介
2014/08/09 Python
linux 下实现python多版本安装实践
2014/11/18 Python
python实现中文输出的两种方法
2015/05/09 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
简历中自我评价分享
2013/10/09 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
副总经理岗位职责
2014/03/16 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript