JSON[JavaScript Object Notation]封装

大家好,今天要和大家讨论的是javascrīpt[以下简称js]封装,高手见笑了!其实js本身就是一个很好的封装!如:数学运算的Math 对象;日期操作的Date 对象;字符串操作的String 对象等等。但是在不同浏览器的执行,又给js提出了更高的要求!我们不得不对一些常用的东西进行封装,当然这仅仅是走出的第一步!这一步确是非常关键的,走好这一步也是非常不容易的!呵呵~当然要谈起这个封装话题,也是很不容易的!是不是应该使用类?那也是众说纷纭的,有说好,有说不好,乖乖~这个话题牵涉到各种编程语言的上上下下(菜鸟说:废话这么多!你不讲我讲好了!),算了,少说为妙!
OB(E1H g0第一,常规封装 PHPChina 开源社区门户4`I&^6[k^.Ky4l
    要说说这个常规,不禁要提起js一般语法!ps:本部分适合菜鸟,高手可以直接跳到第二!
UEB3R(B"fpb8W0什么叫封装?
)Yi$J G2M;jG9q}t7Q&RE0    所谓"封装"即调用对象的用户不必了解实现特定功能的详细代码和过程, 只需懂得设置对象属性(即定义时被封装的变量), 调用其方法(即定义时被封装的函数)就可以了! PHPChina 开源社区门户n:g'|w-Z'y+dIu
    那么怎么去做一个对象呢?其实在js中对象的概念是非常泛化的!你可以把一个函数称之为对象,也可以把一个网页元素叫成一个对象,甚至把一个字符串叫做对象!怎么称呼使人感到困惑,如果一个一个都搞清,那是根本不可能的,也是没有必要的,能用就行~
$c+Xn_"PG.L5V u0    当人们停留在对信息显示要求的层面上时,js是一种点缀作用,使用的方面十分少!于是渐渐的从人们的视野里淡化了,或许这就是传说中的web1.0时代吧!如今web2.0把网页设计带入了一个新的阶段,js以其 ajax技术重出江湖!同时配合流行的 phpmysql简直就是web开发的无敌利器,并且时时给我们带来惊喜! PHPChina 开源社区门户Bi_4H(\F
先来看看怎么写类吧! PHPChina 开源社区门户%{E"~ G:{vds
//---------------------------------------------------------------- PHPChina 开源社区门户^*Bx%E&MF.iB
// pasta 是有四个参数的构造器。 PHPChina 开源社区门户R Ot\C
function pasta(grain, width, shape, hasEgg)
W$Q4K:sE q#S.t!a0{
`6[z#@ r?[5V0    // 是用什么粮食做的? PHPChina 开源社区门户4S8J z(v w:L
    this.grain = grain;
WCuI sz8b }d0    // 多宽?(数值)
7D M$iVMon0    this.width = width;    
4[T}Q1p.B {S0G+Z?^0    // 横截面形状?(字符串) PHPChina 开源社区门户'gF f"X~e"h4]
    this.shape = shape;   PHPChina 开源社区门户f i S4T4g-y|
// 是否加蛋黄?(boolean)
(Cm3Eu,F}?t1FH0    this.hasEgg = hasEgg; 
XOvP b"F8U*XGuN0}
Rm9|d6@0//----------------------------------------------------------------
,~ _D} ]F0    从形式上看它是一个函数,其实它却是有血有肉的类!注意它有4个属性:grain,width,shape,hasEgg!在我的理解中,类(也可以称为构造器)就像你的一个小屋子,里面随便你怎么搞:你可以在墙上贴的到处是你的偶像,也可以贴的到处是报纸......那是自由的,也是个性的,或许这是为什么很多人选择用类写程序的原因吧!
:G&}0|y'KE~n0很多人说:我见到别人是这么写的! PHPChina 开源社区门户1Z6Xx{D*`
//---------------------------------------------------------------- PHPChina 开源社区门户.@;E3x(IIyp
// pasta 是有四个参数的构造器。
B"OR l0S0pasta=function(grain, width, shape, hasEgg)
&u L$h M-y:_4\,m#z f0{ PHPChina 开源社区门户.E%q7M+?6}-P/\ Ss+G d!{{
    // 是用什么粮食做的? PHPChina 开源社区门户n1U'v d4X[kh/Gpy
    this.grain = grain; PHPChina 开源社区门户,W GLp B Tf;B
    // 多宽?(数值) PHPChina 开源社区门户B I{0L)cq4^r
    this.width = width;    
aEjD q/pM&~(Y5w0    // 横截面形状?(字符串) PHPChina 开源社区门户#I7OU ?B:{I#m5@
    this.shape = shape;   PHPChina 开源社区门户"A7Ti+eJ-J;M
    // 是否加蛋黄?(boolean) PHPChina 开源社区门户:C0FHF@Nw
    this.hasEgg = hasEgg; 
D yqWF0}
(kj O6Q,j0//----------------------------------------------------------------
4l*oK7?a0    其实这样的写法是换汤不换药,第一种是标准写法,第二种是当成一个变量来写!使用第二种写法可要注意了,因为引用类之前必须先声明! PHPChina 开源社区门户#o x7j)M;I;Nt3ao
怎样使用类呢? PHPChina 开源社区门户*M`4q+ZZ
    和其他语言一样,需要初始化一下,当然时下 java和php5都支持静态引用了!呵呵~javascrīpt就别想了!当然也就是多写一步new就行了:
Eqh)N ~WO;G.y,g0//----------------------------------------------------------------
0p"\{9n/go0var testPasta=new pasta('rice','10','round',true);
#cH)~;VxYD*[0alert(testPasta.grain); PHPChina 开源社区门户:[!A;r*K@:_ij[ [
//---------------------------------------------------------------- PHPChina 开源社区门户1A9~5|2y-dBac
    以上代码实现了对类pasta初始化成testPasta,同时引用了testPasta的grain属性。其实在javascrīpt的属性和方法是混为一坛,当然要看人怎么去理解了!! PHPChina 开源社区门户/Ug3Q @7?^ { `
第二,JSON封装
']!N T"a?7mA1P0    还是简单讲一下概念吧! PHPChina 开源社区门户Y\fC$st6G%x
JSON(Javascrīpt Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascrīpt Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascrīpt, Perl, Python,php等)。这些特性使JSON成为理想的数据交换语言。 PHPChina 开源社区门户I:LR-\)^Z Xr
注意:上述定义是狭义的,广义上JSON是所有形如{......}的写法! PHPChina 开源社区门户:H2MR7b,s-t4c6z
说到数据交换,那我们先来看看传统的数据交换xml吧!
df6N|9hE!Pk-o0<!--       xml start       -->
:b*G3KjJ3T-b$E!G0<items>
3?3go%| G6N;Y0 <item> PHPChina 开源社区门户N PVS Y i5`;W
  <id>1</id>
7ml3^-`kHy$JX0  <author>h058</author>
S Ldu+\0  <url>http://www.allyes.com</url> PHPChina 开源社区门户oE'E*S(Nd9i
  <content>Welcome to allyes.com</content> PHPChina 开源社区门户h7L+X V/x3tN8q
 </item> PHPChina 开源社区门户(e#WJ{-E U+~$V
 <item> PHPChina 开源社区门户A!b }`3y:Jv7GzV
  <id>2</id>
S} D4B^K0  <author>fly</author>
+u[8?,NA!i0  <url>http://www.fly.cn</url> PHPChina 开源社区门户@K2nwqU+f
  <content>Welcome to fly.cn</content> PHPChina 开源社区门户B$G$whPz BD:a
 </item> PHPChina 开源社区门户~^Z@n2r
</items>
7cH%e9^_`pt"E D0<!--       xml end         --> PHPChina 开源社区门户 ~'L b6zn `
上述代码实现了数据文件xml的传递
8_.bJ#R9I0z'O0同时再来看看JSON怎么写:
UNPEY:O0//----------------------------------------------------------------
` ~$BMU:k-r0{items:[
Zp(sf RO#K0 {
#hJ#_QE*e#H/@2`0  id:1,
d4e.e mm_3n9r)W~0  author:\"h058\",
w8vri zu$ajz0  url:\"http://www.allyes.com\", PHPChina 开源社区门户7P5dJ9L)So
  content:\"Welcome to allyes.com\" PHPChina 开源社区门户)vL"E V AQ'z$R
 }, PHPChina 开源社区门户W8I7sjmy ckx)r
 { PHPChina 开源社区门户6Qg3n1d/^5\0z`
  id:2, PHPChina 开源社区门户%[Z G+A W/ij2e
  author:\"fly\", PHPChina 开源社区门户8V krEB(x,^
  url:\"http://www.fly.cn\", PHPChina 开源社区门户,P3H%l{j"l&R.e(i(\
  content:\"Welcome to fly.cn\"
T'D Eu+dZ^0 } PHPChina 开源社区门户A5n0c3i,kS |]%q
]};
(q.KJ:N+@0//----------------------------------------------------------------
4a9m%}2mXbhQS6d0    比较这两种写法:JSON不仅减少了解析XML解析带来的性能问题和兼容性问题,而且对于js来说非常容易使用,可以方便的通过遍历数组以及访问对象属性来获取数据,其可读性也不错,基本具备了结构化数据的性质。不得不说是一个很好的办法,而且事实上google maps就没有采用XML传递数据,而是采用了JSON方案。 PHPChina 开源社区门户7wbr;w[r[
    JSON能完全取代XML吗?当然不能,原因就在于XML的优势:通用性。要使服务器端产生语法合格的Javascrīpt代码并不是很容易做到的,这主要发生在比较庞大的系统,服务器端和客户端有不同的开发人员。它们必须协商对象的格式,这很容易造成错误。
jCOpfb `0撇开数据交换,对象封装时我们也使用JSON:
2R5R#LP$k~#|7W0//----------------------------------------------------------------
u s ~V']3[{1m0    * JSON is easy. No really. It’s so easy, it’ll make you sick. PHPChina 开源社区门户-{6iZ3\9D[A
    * If you’re familiar with writing classes in PHP, then you’ll most definitely be comfortable with writing Javascrīpt in Object Notation PHPChina 开源社区门户9^5vv-xi$m
    * JSON is nothing more than name : value pairs assigned within an object.
@Uxqiv'Z d0    * JSON is easy to understand because if written well, it’s a self-documenting structure. PHPChina 开源社区门户Uw8x"]V f^
    * JSON is fast! PHPChina 开源社区门户A?Z4[O&Fi6gS E Q
    * JSON organizes the ugly mess of procedural programming. Imagine having more than one init function.
(?"x#AR4\9dL0    * You can impress your friends with JSON because it’s pretty looking PHPChina 开源社区门户Zt%L*b_
    * Your co-workers will love you for writing in JSON because it will most likely not conflict with their scrīpts that are being called within the same web documents.
Ql@ tB9n-Z a0//----------------------------------------------------------------
K%u J8V$@`0这些是从国外的一个网站上摘录的!简单 翻译一下:
!H#V)S_6\0//----------------------------------------------------------------
rl |^+Bx,R'{2g0    * JSON 很简单!甚至简单的让人困惑!
sQ*@y$W J1g0    * 如果他在php写作时非常喜欢用类,那么他也会很自然和习惯使用js中的对象! PHPChina 开源社区门户H(Ge)X;e$@1sjZC
    * JSON 就是在对象中使用名称:值 PHPChina 开源社区门户9JIi3z/]*w3NF
    * JSON 是一种结构化的写法,所以是非常容易理解的。 PHPChina 开源社区门户KHM:QI/o
    * JSON 是快速的! PHPChina 开源社区门户u"P9g \L d
    * JSON 有效的把所有繁杂的东西整合起来了
/F-DzKZ)qu0    * 因为JSON看起来非常美观,这样的代码会使你的 朋友印象深刻!
8d+E%S&r CO5p8I0    * 他的同事也会欣然接受你的代码,因为你的代码命名不会和她们的冲突 PHPChina 开源社区门户Un%AYv_
//----------------------------------------------------------------
5x1I$qk.},D-@B;SL0    这就像以前我下定决心学习php一样,为了这些优点,我义不容辞,毫不犹豫的接受,更活灵活现的使用! PHPChina 开源社区门户nC@*P f8Q4k)x:F
如果这些还不能吸引你使用JSON,好,我们就来看看优秀代码的封装!
C eY6g6U tU Kl.jB0第一分析:Sam Stephenson 的作品:prototype
_{my#A/l3h0你可以看到
_,N'~"Ty h y0//----------------------------------------------------------------
8lY(P"l9e@@:\~'aW1~0var Prototype = { PHPChina 开源社区门户\$HS H#X+Uc$`
  Version: '1.4.0', PHPChina 开源社区门户 C X!\H_6D
  scrīptFragment: '(?:<scrīpt.*?>)((\n|\r|.)*?)(?:<\/scrīpt>)', PHPChina 开源社区门户6}+X3~1|$j1dNB
  emptyFunction: function() {}, PHPChina 开源社区门户9b*t5ZG/Q R
  K: function(x) {return x} PHPChina 开源社区门户9U pw4]A0|OY W3]
}
!b5I!}*V bm0//----------------------------------------------------------------
R%DX7K ce2}s ~0这就是一个JSON简单封装! PHPChina 开源社区门户$?2]0jz)c L9R#].J!J}
第二分析: Thomas Fuchs的scrīpt.aculo.us
:N'o}.VRC0//---------------------------------------------------------------- PHPChina 开源社区门户w)]h'_4Qp9c
var scrīptaculous = {
-[3]*C(f n^#l0  Version: '1.6.4', PHPChina 开源社区门户{9C#JcaC }1j
  require: function(libraryName) { PHPChina 开源社区门户:H-e;kD:dc
document.write('<scrīpt
k%~&x{`R|0type="text/javascrīpt" src="'+libraryName+'"></scrīpt>'); PHPChina 开源社区门户| NC1\E fH$y
  }, PHPChina 开源社区门户7iYu1m.t;H
  load: function() { PHPChina 开源社区门户\(I{6KqJ&d
......//本部分省略 PHPChina 开源社区门户;|,s O_.Wn?-q
  } PHPChina 开源社区门户_J3ll/?1o
} PHPChina 开源社区门户5o B7J'S*TA {$Q ~U
//----------------------------------------------------------------
{QX/Y]^ E+L0从这个类看并没有什么特殊的地方,只是比第一分析的JSON稍微复杂一点
l?{$jjXI pm0第三分析:yahoo的GUI类库 PHPChina 开源社区门户@2lzl6wrpXw,@'@ h
//----------------------------------------------------------------
S8X$p"j!@&n$} lL0if (typeof YAHOO == "undefined") {
,in} D$`h&pD0    YAHOO = {};
6N.~3x g d b0} PHPChina 开源社区门户F_Jl|
YAHOO.namespace = function(ns) {
*r&hK%m'_4B\0    if (!ns || !ns.length) { PHPChina 开源社区门户k5I/e*BWe
        return null;
8c2Cq#X[0    }
)d-y$oxA0    var levels = ns.split(".");
"\+Ix!x(FOZ0    var nsobj = YAHOO;
b&oho'A(\L0    for (var i=(levels[0] == "YAHOO") ? 1 : 0; i<levels.length; ++i) {
,z WD;h4q D/f0        nsobj[levels[i]] = nsobj[levels[i]] || {};
r?'wSA*d0        nsobj = nsobj[levels[i]]; PHPChina 开源社区门户)Jv|G9C0Z
    }
t}P``6O(T$LS#g0    return nsobj; PHPChina 开源社区门户 o#j+w*A7l a)I y0V7l T
} PHPChina 开源社区门户6}8`PG+bl-]%C8I~/n
//----------------------------------------------------------------
:O/u z oP}!vdT0这个类就是比较隐形的,看看 YAHOO = {}吧,已经申明了JSON! PHPChina 开源社区门户m?B L5g
    菜鸟说:我还以为什么呢?不就是无类型对象的写法吗?呵呵~在一定程度上可以这么理解!说起来很简单,能不能灵活运用就要看个人的编程习惯了!同时,我觉得JSON也是有弱点的,这样的对象是一执行就会被定义了,这在一定程度上占用了一部分内存,所以像JSON这样的静态对象要考虑是否有必要!当然这么点影响对于现在的电脑配置是可以忽略的了!关于js的优化问题是很小却很杂的东西,要求太多的技巧!希望下次有机会和大家一起研究js的优化!
KC9brD_0好了,关于对象的封装问题就说到这里!只是稍微点了一下,如果说要完全说清楚是不可能的,也是没必要的,因为现在网上有一大堆的资料正等着你去翻阅呢!希望这篇拙作可以给大家带来一点点收益! PHPChina 开源社区门户FI/s2zDt}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值