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中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
html5 canvas js(数字时钟)实例代码
Dec 23 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
Dec 30 Javascript
jQuery中$.each使用详解
Jan 29 Javascript
80%应聘者都不及格的JS面试题
Mar 21 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
通过vue-cli3构建一个SSR应用程序的方法
Sep 13 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
vue组件tabbar使用方法详解
Nov 06 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 Javascript
jQuery实现简单全选框
Sep 13 jQuery
js闭包的9个使用场景
Dec 29 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实现自动登入google play下载app report的方法
2014/09/23 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
Python字符串替换实例分析
2015/05/11 Python
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
详解python的四种内置数据结构
2019/03/19 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
python绘制雪景图
2019/12/16 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
上班迟到检讨书
2014/01/10 职场文书
软环境建设心得体会
2014/09/09 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android