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 相关文章推荐
DOM基础教程之使用DOM控制表格
Jan 20 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
Sep 14 Javascript
理解 JavaScript Scoping & Hoisting(二)
Nov 18 Javascript
js+ajax实现获取文件大小的方法
Dec 08 Javascript
深入理解node exports和module.exports区别
Jun 01 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
Jun 24 Javascript
JavaScript中Form表单技术汇总(推荐)
Jun 26 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
Jun 19 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
Jul 05 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 Javascript
vue操作dom元素的3种方法示例
Sep 20 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
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
php文件上传类的分享
2017/07/06 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
浅谈Python中数据解析
2015/05/05 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
python实现求最长回文子串长度
2018/01/22 Python
python 字典套字典或列表的示例
2019/12/16 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
土木工程实习生自我鉴定
2013/09/19 职场文书
陈欧广告词
2014/03/14 职场文书
小学生倡议书范文
2014/05/13 职场文书
疾病防治方案
2014/05/31 职场文书
新年晚会开场白
2015/05/29 职场文书