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 相关文章推荐
非常好的js代码
Jun 27 Javascript
AJAX分页的代码(后台asp.net)
Feb 14 Javascript
JavaScript 图像动画的小demo
May 23 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
Jan 06 Javascript
使用Grunt.js管理你项目的应用说明
Apr 24 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
Jan 26 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
JS简单判断函数是否存在的方法
Feb 13 Javascript
利用Ionic2 + angular4实现一个地区选择组件
Jul 27 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
js实现简易拖拽的示例
Oct 26 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
编写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使用SOAP调用.net的WebService数据
2013/11/12 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php实现的简单检验登陆类
2015/06/18 PHP
php session 写入数据库
2016/02/13 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python编程中的异常处理教程
2015/08/21 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
SQL Server面试题
2016/10/17 面试题
const和static readonly区别
2013/05/20 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
优秀老师事迹材料
2014/02/05 职场文书
机械专业求职信
2014/05/25 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2014年教研员工作总结
2014/12/23 职场文书
现实表现材料范文
2014/12/23 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS