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 相关文章推荐
jQuery+jRange实现滑动选取数值范围特效
Mar 14 Javascript
JavaScript时间转换处理函数
Apr 14 Javascript
js去除浏览器默认底图的方法
Jun 08 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
文件上传插件SWFUpload的使用指南
Nov 29 Javascript
详谈js中标准for循环与foreach(for in)的区别
Nov 02 Javascript
vue环境搭建简单教程
Nov 07 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
Dec 05 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 jQuery
Vue的transition-group与Virtual Dom Diff算法的使用
Dec 09 Javascript
JS this关键字在ajax中使用出现问题解决方案
Jul 17 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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
PHP 读取和编写 XML
2014/11/19 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
Python生成密码库功能示例
2017/05/23 Python
python实现excel读写数据
2021/03/02 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
numpy返回array中元素的index方法
2018/06/27 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
python3 下载网络图片代码实例
2019/08/27 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Python读写锁实现实现代码解析
2020/11/28 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
教师岗位职责
2013/11/17 职场文书
数控专业应届生求职信
2013/11/27 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
单位员工收入证明样本
2014/10/09 职场文书
心理学培训心得体会
2016/01/22 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
Redis的字符串是如何实现的
2021/10/24 Redis