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 相关文章推荐
Prototype中dom对象方法汇总
Sep 17 Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
jquery根据属性和index来查找属性值并操作
Jul 25 Javascript
字符串反转_JavaScript
Apr 28 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
AngularJS实现Input格式化的方法
Nov 07 Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 Javascript
js input输入百分号保存数据库失败的解决方法
May 26 Javascript
React Component存在的几种形式详解
Nov 06 Javascript
Vue实现根据hash高亮选项卡
May 27 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
Jun 01 Javascript
OpenLayers加载缩放控件使用方法详解
Sep 25 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
实现树状结构的两种方法
2006/10/09 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
JS中数据结构之栈
2019/01/01 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
总结Python编程中三条常用的技巧
2015/05/11 Python
Python实现telnet服务器的方法
2015/07/10 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Numpy之random函数使用学习
2019/01/29 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
详解python对象之间的交互
2020/09/29 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
信息科学与技术专业求职信范文
2014/02/20 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
工厂见习报告范文
2014/10/31 职场文书
优秀教师先进材料
2014/12/16 职场文书
寒假安全保证书
2015/02/28 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript