<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[独木舟]]></title>
  <subtitle type="html"><![CDATA[我的IT生活]]></subtitle>
  <id>https://kanoe.cn/</id>
  <link rel="alternate" type="text/html" href="https://kanoe.cn/" /> 
  <link rel="self" type="application/atom+xml" href="https://kanoe.cn/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2012-02-17T13:31:41+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[C语言二进制文件读写（Binary I/O)实例]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=17" label="Coding" /> 
	  <updated>2012-02-17T13:31:41+08:00</updated>
	  <published>2012-02-17T13:31:41+08:00</published>
		  <summary type="html"><![CDATA[经常遇到这样的问题。由于二进制文件没有ASCII方式的直观性，所以读写时调试起来比较麻烦。用C语言读写文件的好处之一是比C++的I/O库快（如果做过ACM应该会有这样的体验），此外C语言读写只需要简单的几个库函数，如fopen(),fclose(),fwrite(),fread(),fsanf(),fprintf()，其中fsanf()和fprintf()用于ASCII文件的读写，fwrite()和fread()用于二进制文件的读写。以下是一个小小的实例总结：<br/><br/>typedef struct tagPoint<br/>{<br/>double x,y,z;<br/>}Point;<br/><br/>设有结构体：Point plist[100];<br/><br/>文件：file.dat<br/><br/>file.dat中的数据和结构体数组plist中的数据组织方式一致。<br/><br/>现在我们的任务是：<br/><br/>1、将文件file.dat中的数据读到plist中<br/><br/>2、或者将plist中的数据写到文件file.dat中。<br/><br/>读：<br/><br/>FILE *fp = fopen(&#34;file.dat&#34;,&#34;r&#34;);<br/><br/>fread(plist,sizeof(Point),100,fp);<br/><br/>fread的返回值为实际读入的结构体Point的元素个数。<br/><br/>写：<br/><br/>&nbsp;&nbsp; FILE *fp = fopen(&#34;file.dat&#34;,&#34;w&#34;);<br/><br/>fwrite(plist,sizeof(Point),100,fp);<br/><br/>fread的返回值为实际写入的结构体Point的元素个数。<br/><br/>简单吧，fread和fwrite的参数完全一样。在实际进行文件读写之前，应该先弄清文件数据的数据结构，这样就可以根据数据结构来设计与文件数据一致的结构体，一次性读入或写入数据。而不需要每次从二进制文件中读写一小块儿数据，从而避免出错，同时也避免多次的循环读写，加快读写速度。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/coding/233.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=233</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[马化腾：打开腾讯 开放不是一种态度是能力]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=8" label="Live" /> 
	  <updated>2011-10-23T15:21:03+08:00</updated>
	  <published>2011-10-23T15:21:03+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;<font color="#000000">&nbsp;　　我似乎不应该向出租车司机提起腾讯。车窗外，一幢幢高楼沿着深南大道逐个晃过去。出租车司机因为那幢&ldquo;马化腾的大楼&rdquo;触发了谈兴。他一边有腔有调地讲述深圳人眼中的马化腾，一边顺道得瑟起他的QQ泡妞故事。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　是的，在中国，谁都能对这家企业说上一二。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　它用了12年的时间，终于成长为压在中国互联网创业者身上的&ldquo;三座大山&rdquo;之一；它在一个亦步亦趋相互模仿的产业环境中，成为被其他抄袭者指责抄袭次数最多的互联网公司。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　它拥有全世界最大的互联网社交网络系统，但对于6.7亿QQ活跃用户，业界的评价却是&ldquo;有用户，无粉丝&rdquo;。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　它被比作一头在瓷器店中长大的大象。出微博、推团购、再加上什么拍拍、搜搜，QQ电脑管家、QQ影音，没有东西是它不做的，堪称行业公敌。&ldquo;大象&rdquo;在去岁末偶然又必然地卷入了一场互联网狩猎。它不是宋襄公，玩不转&ldquo;退避三舍&rdquo;；也不是功夫熊猫，打架前先摆个POSE通知观众，它一上阵就逼迫用户二选一，它有点&ldquo;傻傻看不清楚&rdquo;。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　如今，料峭春风吹酒醒。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&mdash;&mdash;关于3Q大战的正向作用，马化腾说：&ldquo;是在1万多名员工中统一了思想，平衡了利益，把正确的事情加快向前推进。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　<strong style="font-weight: bold;">什么是正确的事情？</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　2010年12月5日，马化腾发表了《关于互联网未来的8条论纲》，腾讯宣布进入为期半年的战略转型筹备期。注意，站在行业的角度谈论纲，这在腾讯过去12年的历史中很是鲜见。远远望去，这个有着7条业务主线、一千多个产品、超过1万名员工、2010年净利润达到80亿元、三倍于其他三家门户网站利润总和的巨无霸，正在学习成为领袖。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　半年来，关于腾讯的新闻事件包括：连续十场国内各界专家云集的&ldquo;批判会&rdquo;、通过50亿元产业共赢基金(2011年6月15日马化腾宣布增容至100亿元)，一口气投资高朋网、华谊兄弟、艺龙等项目，其数量超过过去12年总和。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　与之同时，腾讯先后宣布开放腾讯微博、腾讯朋友、QQ空间以及即时通讯QQ等平台。而截至今年上半年，有近2万个合作伙伴已经或正在排队等待到腾讯&ldquo;拎包入住&rdquo;，合作伙伴一款应用拿到的单月最高分成已突破1000万元。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　从做生意到做生态，2011年必将构成中国互联网的开放元年。试想，随着人人、新浪、奇虎、百度等一大堆开放平台的出现，几个人的小团队都有可能做出几千万用户的产品。李开复称，中国互联网创业成本到了有史以来最低的时刻。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　是的，尘埃与曙光已经翻过大山，更多的故事也将由此滋长，只是主角，将不再只属于马化腾们&hellip;&hellip;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　这才是马化腾</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　著名的普鲁斯特问卷由生活、思想、价值观及人生经验等一系列问题组成。13分24秒，2011年6月3日，深圳腾讯大厦，马化腾回答了这份问卷。从这样的切口看出去，或许可以更立体地认识马化腾。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　<strong style="font-weight: bold;">先看看这份普鲁斯特问卷</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　独家问卷</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　1.你最希望拥有哪种才华？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　演讲的才华。平面媒体还好，电视压力大了。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　2.你最痛恨别人的什么特点？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　吹牛，浮夸。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　3.你最恐惧的是什么？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　谈恐惧夸张了。会有一些担心，比如担心团队不和谐啦之类的。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　4.还在世的人中你最钦佩的是谁？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　比较老套了。乔布斯，很多人都钦佩啦。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　5.你最珍惜的东西是什么？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　诚信、正直。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　6.你最喜欢的职业是什么？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　研发产品。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　7.觉得自己最有底气最自豪的能力？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　拍摄哈雷彗星，学生时代，1986年。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　8.你对自己的外表哪一点不满意？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　太瘦啦。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　9.你最喜欢女性身上的什么品质？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　人品好吧，善解人意。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　10.何时何地让你感觉到最快乐？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　在家里。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　11.如果你能选择的话，你希望让什么重现？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　导致我腰椎间盘突出的那次事故不要发生。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　12.您身上有没有典型的天蝎座特征？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　有吧。神秘？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　<strong style="font-weight: bold;">天蝎座的错觉</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&ldquo;你觉得自己有没有一些天蝎座的特质？&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　马化腾思考了数秒，&ldquo;比如神秘？&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　如果不是身处互联网行业，他或许真会与公众彻底绝缘。同样姓马，相比马云煽动性很强的口才，马化腾似乎更愿意通过邮件来表达自己的想法。这位40岁的技术宅男从腾讯上市到3Q大战之前，几乎只在每年年底接受一两家平面媒体采访。身边人告诉我们，&ldquo;有一年，Pony在年初的时候接受了媒体采访，出门后如释重负，对公关部门说，今年全年的采访任务提前完成了。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&mdash;&mdash;同样是天蝎座，10月29日生日的马化腾与10月27日生日的周鸿祎、10月31日出生的张朝阳又有着很大不同。周鸿祎自比孙悟空，体现天蝎座攻击的一面，不打仗不放炮他会很憋闷；张朝阳则更张扬一些，你可以说他爱炒作、爱出风头，但第一代互联网企业家如果单靠玩炒作似乎也走不到今天。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　马化腾更像是一个崇尚实用主义的技术人才。你如果将&ldquo;时代精神&rdquo;之类形而上的问题抛给他，他会告诉你&ldquo;我真没想那么多。虚的东西我不会讲。&rdquo;但是如果你请他谈谈产品，他会自问自答地说出一大堆自己的思考。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　一位腾讯公司的高层告诉我们：&ldquo;Pony对产品抓得很细，细到一个PPT上有细节表述错误他都能看出来。我们有时劝他，不要这么细，这个细致的事情交给我们去做。他会花很多时间去看用户的反馈，看BBS、看博客，看别人对产品的感觉。我们并不是很在意用作汇报的PPT多好看，背景、动画什么的，这个不重要，有数据，有用户反馈就可以了。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　毫无疑问，如果时代没有将马化腾放在深圳，没有将他带进互联网，没有让腾讯成为一家公众公司，他肯定还会坚定不移地活在自己的世界中。他或许会是一名地理老师，或许会去天文台工作，又或许会走上另外的平凡道路。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　他曾经在中学时代的日记中写道，&ldquo;请父母买一台天文望远镜，如果不给我买的话，可能扼杀了一个天文学家。&rdquo;而当我们在采访中问他，&ldquo;最让他感到自豪的一件事情是什么？&rdquo;他的回答竟然是，1986年在深圳中学生中第一个观测到了哈雷彗星。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　当前，在目睹了Facebook、苹果Appstore 的成功之后，整个中国互联网产业体系正急速地从封闭走向开放，从百度、新浪到阿里巴巴、京东都在积极布局自己的开放平台战略。腾讯，显然不能再做一颗孤独的哈雷彗星。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　马化腾承认，自己已经意识到腾讯在发展了12年之后，开始遇到越来越多来自市场、社会和行业内的种种挑战。&ldquo;姿态放得很低。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　2011年6月15日，腾讯履行半年前做出的承诺，在北京召开规模空前的开放大会。开放大会上，各路英雄云集，场面蔚为壮观。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&mdash;&mdash;只是抢在腾讯开放大会之前的5月31日，奇虎360也在北京举办了开放大会，周鸿祎除了高调宣布其&ldquo;360开放计划&rdquo;之外，也不忘调侃马化腾。他将腾讯的开放称为&ldquo;被开放&rdquo;，甚至称，&ldquo;今天马化腾所做的，都是两年前我给的建议。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　6月13日，就在腾讯开放大会只差2天的时候，360又宣布与人人网全面结盟，高调进军社交网络。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&hellip;&hellip;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　从去年&ldquo;3Q大战&rdquo;的恶性竞争，到今天在开放问题上暗中叫板。有公关界的人称，360的开放大会在时期上是提前了的。这不重要，重要的是两只本不在同一量级的&ldquo;蝎子&rdquo;，又一次被舆论锁定在一起，静静地悬挂在互联网的大幕之中。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　有人说，3Q大战会有第二季。这依旧不重要，重要的是两家企业真会在各自的开放世界里走得好吗？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　时间开始跑动。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　<strong style="font-weight: bold;">　基本假设的错觉</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　今时今日，你若问国内哪一家商业公司真正值得尊敬，答案，都应是无解。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　就像深圳街头那副著名的标语，&ldquo;时间就是金钱，效率就是生命&rdquo;。三十多年狂飙突进的重商主义，让我们拥有了若干商业明星，却并未拥有真正意义上的商业文明。无论是3Q大战、百度面临的版权诉讼、还是阿里巴巴的支付宝问题，中国公司似乎都面对着&ldquo;谁规模大、谁遭到质疑就大&rdquo;的问题。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&mdash;&mdash;市场份额与受人尊敬的程度，的确不成正比。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　让我们回到腾讯。半年前，马化腾发表了《关于互联网未来的8条论纲》。注意，站在行业的角度谈论纲，这在腾讯过去12年的历史中很是鲜见。至于论纲这样的词汇，甚至更容易让人联想到1517年马丁 路德 金对宗教改革的95条论纲。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　在这场演讲中，马化腾说，&ldquo;垄断是一个令人烦恼的罪名，但有的时候确实是一个假想的罪名。&rdquo;他说，腾讯开始步入为期半年战略转型筹备期。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　半年中，腾讯先后在全国各地举办了10场&ldquo;诊断腾讯&rdquo;的研讨会。从现场气氛看来，研讨会更像是批判会。马化腾在第9场会议的现场说，&ldquo;我在网上被骂的机会很多，往往在微博上我说一句话很多人都会骂，所以心理承受能力超过大家的想象。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　那场会议下来，他密密麻麻地记了三张纸，纸的背面都有记录。腾讯想要改变业内对它&ldquo;抄袭&rdquo;、&ldquo;垄断&rdquo;的印象，这不用怀疑&mdash;&mdash;即便在中国，也没有人愿意背着这样的名头。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　事实上，互联网世界瞬息万变，生死转换往往只在一念之间。12年来，腾讯并未遇到真正意义上的大地震。马化腾从不掩饰自己的危机感，腾讯高管团队在创业初期同样有过靠炒股赚钱给员工发工资的窘迫经历，但若要把某种危机感传递到10000名员工心中，注意是心中&mdash;&mdash;这便是一个系统性问题。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　如陨石坠地，3Q事件成为了激发腾讯系统性改革的关键点。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&ldquo;只要我们用心做，就什么都能做好。只要把用户服务好了，就可以持续发展了。腾讯团队以前会有这些基本假设，去年的事情，公司对于公众和行业的情绪起初很不理解，觉得自己没有错，为何会招致如此非议？但后来一想，我们基本的假设不对，这些是非曲直就都是浮云。&rdquo;腾讯高级执行副总裁李海翔说。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　可怕的是错觉。更可怕的是基于错觉产生的幻觉，以为奇迹的荣光会永远为自己开一扇大窗。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　正如这样一个段子&mdash;&mdash;弟子问师父：&ldquo;怎样才能创造奇迹？&rdquo;师父答：&ldquo;你现在为我烧饭，一会告诉你。&rdquo;饭熟后师父说：&ldquo;你开始做饭的时候，是生米，你不断地添柴加火，就将生米煮成了熟饭，这不是一个奇迹吗？&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　这是奇迹，但人不能永远活在奇迹中。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　马化腾和腾讯高级副总裁张志东有过这样的表态：&ldquo;腾讯团队有一股很浓的学生气质，这个团队的基因是不停地解数学题，做产品，不是做别的。我们五六年前可能这样去走，问题不是很大，可是不知不觉，我们在五六年里成长了好几次，也变成了产业的排头兵，但我们自己没有及时转化角色。我们发现，自己和外界的看法出现了很大的不一致。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　马化腾说，&ldquo;(以前遇到问题)我们往往在很多场合会辩解、解释，说是什么情况，我们内部怎么样，甚至会给大家解释细节上的来龙去脉，希望取得大家的谅解和同情。但是我们反思中也忘了一点，就是说之所以形成这样的很多的印象，不是一天一夜形成的，而是长期很多很小的事件形成的。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　的确，在道德感本就模糊的互联网产业，腾讯凭借&ldquo;我来了，我看见，我参与&rdquo;的八爪鱼打法顺利成长为全民公敌并非一日之功，其究竟存在什么问题呢？DCCI互联网数据中心创始人胡延平认为，&ldquo;归根到底，问题出在腾讯核心决策层对于整个产业和市场存在一种错觉。这种错觉下，业务布局、业务开展的方式都有问题，市场公关变成了消防员四处着火四处救火。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　因此，就算没有《狗日的腾讯》，就算没有360，也会有鲁迅所说的，&ldquo;我的文章还没出来，就已经有人开始在愤怒地磨墨了！&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&mdash;&mdash;开放，势在必行，开放，势不可挡。推动一只小帆船开放不难，要让一艘2010年净利润达到80亿元、三倍于其他三家门户网站利润总和的航母转向，这注定会引发行业生态的连锁反应。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　但这是必须的。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　<strong style="font-weight: bold;">　罗马大城的错觉</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　这是2011年6月3日，从腾讯总部39层望出去，窗外是一片繁忙的深圳港。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯是座大城，城墙高耸，争议渐多。大城内的人与事，真真假假地流传于江湖，大家似乎听说过一点，又无从认证、了解整个真相。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　关于马化腾是如何工作的，微博上有这样一种说法：1.一般凌晨3～4点才休息，上午10点后醒，经常深夜邮件谈业务，腾讯由此形成浓郁的邮件文化；2.关注腾讯1700多个产品中的相当数量；3.不允许手下说技术上无法实现，能直接列举出各个部门技术高手的名字；4.感兴趣的邮件会立即升级，然后拖一堆高管进来，推动事情前进。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　马化腾每天的工作习惯，采访中我们并没有多问，他告诉我们采访前的那一天晚上他六点才睡。至于腾讯的邮件文化，在问答网站&ldquo;知乎&rdquo;上也有这样一个段子&mdash;&mdash;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&ldquo;Pony经常回复的还是产品类的讨论。关于他的诸多传说中，腾讯超级产品经理一说是最切合实际的。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&ldquo;一次，他要求页面上加某种锚标功能，当用户对页面特定区域进行复杂操作之后，页面能够返回到原来触发动作的位置，免得从头再翻。我询问了技术人员，技术回答说：这根本实现不了。于是，我回复邮件告诉他说：在技术上不可能实现。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　大约两分钟之后，他回复了我：你说什么？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　我突然意识到自己说错话了，只能回信道歉：抱歉，我们去想想办法。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　他过了一阵子回了一封长信过来：第一段里告诫我，在腾讯不允许说什么事情在技术上做不到。然后，他在信中列举了三四个部门里的Html高手，列出他们的名字和其经理的姓名，要求直接去联络他们，请求他们给予技术上的支持。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　&hellip;&hellip;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　似乎印证了此强彼弱的规律，以腾讯今日的地位，企业形象和公共关系沟通空前重要。但让我们吃惊的是，当我们坐在腾讯员工食堂的大厅，接待人员告诉我们，我们应该是第一家在腾讯员工食堂吃饭的媒体。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　这样的表述是否准确，并不值得深究，因为腾讯在过去很长一段时间里有着内向的企业气质，是毫无疑问的。据说在2007年左右，腾讯尚没有一个可以统一谈市场、品牌和公关方面问题的专职副总，而公关则只是总裁办下面的一个由几个人组成的部门。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　即便到了今天，腾讯公关部门也不过20多人，对于一家拥有6亿多活跃用户的互联网企业，这样的人力配置并不豪华。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　12年来，腾讯在中国互联网领域跑出了深圳速度，而公司上下也有着浓重的深圳气质。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　什么是深圳气质？年轻、活力、敢于挑战，也同样善于模仿，或者说抄袭。员工食堂是一个能够展现公司气质的地方，相比谷歌中国的食堂，腾讯的食堂在餐食供应上没有那么豪华，但是餐具却十足卡哇伊。几位年轻女员工拿着卡通味十足的餐具向我们介绍时的样子，让人印象深刻。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　时至今日，提及腾讯，越来越多的人会用&ldquo;企鹅帝国&rdquo;这样的词汇。它能赚钱、市值高、势力庞大堪称帝国，但帝国也有烦恼&mdash;&mdash;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　又比如微博，&ldquo;为什么现在成了一个独立机构？原来是7个部门一起做，每个部门都有自己的想法，我们开协调会议，7个部门参与，都有自己的出发点：做QQ的部门认为，这是未来的方向，如果丢的话腾讯就没有前途、自己的部门就没戏了，另一个部门崛起成了一个新平台了；做社交的QQ空间这一平台，按道理应该是最接近Facebook的平台，他原来觉得微博不能成型，最后看着别的部门做起来，觉得不太支持，或者觉得怎么和我竞争，把公司主要的资源给他了&hellip;&hellip;&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯需要信仰。比如，&ldquo;以前很多时候，腾讯希望去官僚化，产品团队像小公司方式经营，这又导致团队在冲杀时如果犯了错误，比如模仿之类容易给外界印象是腾讯蓄意而为，指责整个公司。现在，公司要求大家的一举一动必须传递整体的责任感。&rdquo;</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　2011年6月15日，腾讯开放大会在北京举办，现场一千多个座位被早早地预定一空。马化腾履行他半年前作出的开放承诺。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　帝国开门。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　诊断2 里里外外看腾讯</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　2011年初，腾讯分别邀请数十位国内知名意见领袖、法学专家、行业专家等参与其系列论坛，听取社会各界的建议忠告和批评，腾讯每场保证起码有一位最高层管理者列席。&ldquo;诊断腾讯&rdquo;研讨会共10场。以下专家观点来源自由蓝狮子辑录即将出版的《X光下看腾讯》。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　传播学者说</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　吴晓波 财经作家 公司有两种身份，一是功能要符合人类的发展，这个腾讯没有问题，第二，企业是作为社会化的公司。但腾讯是很难被定义的企业，到今天也是这样。比如百度是搜索企业，阿里巴巴是电子商务企业，很容易被定义，腾讯一开始就是一个很难被定义的企业，到现在为止我们每个人都在用QQ，QQ的提供者它的文化和我什么关系？其实这个腾讯一直没有定义清楚，其在历史上的角色是模糊的。我建议公司要专门来研究这个事情：我们是谁？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯应该如何赢得公众信任？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　罗振宇 资深媒体人 我觉得腾讯犯的第一个错误是自我认知能力的低下。我们很喜欢看&ldquo;一头大象闯进了瓷器店&rdquo;的故事，不过腾讯不是这个故事，它是一头小象在瓷器店长大了，大到周围的瓶瓶罐罐都害怕得惊声尖叫，它还不知道。我们做一个诛心之论，3Q大战的时候腾讯做出这样的决定一定是经过人情、法理各方面的考量，没有问题，但因为你是一头大象，你已经超出市场竞争当中的普通企业的规模和位置。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　投资人说</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯是否需要从技术驱动转型为管理驱动？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　薛蛮子 天使投资人 腾讯目前最大的挑战，不是来自外部，而是怎么能把一万名员工的思想统一，共同认识到该干什么。你们最大的敌人是自己，你们又有团队，又有执行力，又能赚钱，短时间内没有人像你们这样能赚钱的，所以你们最大的敌人是自己。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯是一个高度军事化的团队、执行力极强的一个团队，指哪打哪，而且来之能干，干之能胜，其招法就是大兵所到寸土不留，其哲学和文化到最后使其变成了众矢之的。腾讯要摆脱目前的处境，就必须避免头疼医头、脚疼医脚，要深深地思索。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　如何才能成就世界级的创新？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　王冉 易凯资本CEO 腾讯其实有创新，但这些创新没有用于社会大格局的推动和变化。至于说如何赢得世界的尊重，这个可能没有捷径，不是说在中国再复制一个Facebook，让它在中国成功，你就赢得了世界的尊重。我觉得只有我们在下一代的社交网络，下一代真正能够影响世界的商业模式里面，我们有自己的脚印，有自己的足迹，到那个时候才有机会。未来的社交网络有可能是图片、影像驱动的，在这方面腾讯应该可以有些布局。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　<strong style="font-weight: bold;">　管理专家说</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯的拓展方式，内部有哪些问题可为行业借鉴？</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　王育琨 管理专家 现在实体经济在不断研究互联网，但互联网企业却常常不注重实体经济。很多企业创始人都不太懂：时代在不断前进，你自己的生命意义也在前进。你的价值在哪里，团队的价值在哪里？公司好坏与外部专家的说法并无太大关系，但它应该有一个个的关键接口，一层一层的场域&mdash;&mdash;腾讯能不能在公司里里外外建立出这种强大的场域，让每个员工都将自己身体的智慧放出来跟每一个接口连接？不管是传统企业还是互联网企业，要想走向伟大，管理上这是非常基础的一点。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　汤道生 腾讯高级副总裁 其实社会的成熟度也会引起大家对全新东西接受的程度，是否在适合时间推出合适的产品，这也会有很大的影响。苹果以前也有不断的创新，我印象比较深的是一个类似于手提的工具，我接触的时候是1991年，当时我还在读大学，看到这种很新的概念，班里面有一个人有，他就拿来炫耀，但是发现这个东西太新，社会不能接受这样的新东西。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　我们发现美国社会整个人群的成熟度、接受新事物是最高的，它也会出现这种情况。像微博，Twitter很早在美国流行，我们也思考投入团队去做，也是由我们创新团队启动这个项目，那个项目叫&ldquo;TaoTao&rdquo;，它没有在对的时间执行，当时智能手机还没有普及，没有智能手机微博也不可能像现在发展这么好。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　<strong style="font-weight: bold;">　腾讯高管说</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　张志东 腾讯高级副总裁 腾讯毕竟已经是一个一万多人的企业，我们去年增加了将近4000位同事。原有的组织形态，设计的模式是一个大农庄，然后每块田我们的同事都去勤勤恳恳地开垦，整个组织文化和组织体系是这样的一个体系，这样的体系要去适应，也不是很容易的，这需要很用功，也会有很多组织不顺滑、不顺畅，磕磕碰碰，中间难免有一些反复和摔跤。成长给我们腾讯带来很多的快乐，也带来了不少成长的烦恼，也许对同一各行业或者其他行业新的企业，大致可能会有这个坎，腾讯也是走到了这个坎上。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　创新与变革</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　答案3 开放不是一种态度，是能力</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　12年前，我们这一代人创业的时候，就像种下一棵果树，所关注的就是能不能挣到钱，付不付得起服务器的费用，是否发得出员工的工资。可是当果树越来越多，确保单棵果树的收成已经不是你的目标，这个时候，你要关注的是果园的气候是不是适宜。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　开放是大势所趋，也是商业模式和产业链发展的必然要求。几年前，唯一具有社区概念的是中国移动的梦网。当时，也没有人谈论开放与不开放，都是合作。直到Facebook诞生，涌现出一批依赖于其他互联网平台生长的开发商、服务提供商。这个概念更加清晰，互联网的激情会更多，力量会更大。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　我们的一举一动看似慢，其实是比较稳健的思路。腾讯一直考虑开放，只有把平台的能力准备好，知道怎么回事，知道如何把内容引进去，才能最终将产业链做好，开发商才能赚钱。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　目前，腾讯开放最大的是SNS模块，即QQ空间和QQ朋友，这也是开发商分成最多的一部分。Q+会在7月份正式推出来，目前也还在进一步开发中。所以对于腾讯来说，从我们过去做生意转变到做生态，我觉得是一个很自然的事情，这不是外界给你的要求，而是你自身成长的很自然的使命转变。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　<strong style="font-weight: bold;">　把坏事变好事是一个能力</strong></font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　去年3Q事件的正向作用挺多的，比如加快步伐统一思想，再一个就是要改变做事的方式。要保持对外的沟通，包括跟媒体的沟通，包括跟开发者的沟通。国外很多大公司很注重这个，我们以前注重得很少，所以新品发布会、年会这些都不多见。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　关于开放，有人或许会说腾讯在这方面为什么迟迟没有成果，好像只是做自己的事情，没有对产业和其他的中小企业开发者做贡献，你没有做出表率还跟别人竞争，怎么说都是和自有的体量不相符的。我觉得这个批评还是挺中肯的。这也是促进我们在做企业的时候、研发的时候，一些更长远的东西要提前规划，多沟通。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　腾讯的产品阵线很长，下面的团队在冲杀的时候，对他来说，就是跟一个小公司一样，他做事也不会承担腾讯这么大的压力，但是实际上你做错了事情的时候，所有人都认为这是腾讯做的，好像是蓄意这么搞的。其实未必。但大家的指责是对整个公司的。因此正向的精神和理念需要深刻传达，你的一言一行、一举一动都是代表整个公司的平台的，这个责任感要往下传递，原来我很少讲这个的，这个是比较大的一个反思。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><strong style="font-weight: bold;"><font color="#000000">　　产业上游的价值将重新崛起</font></strong></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　关于产业共赢基金，我们以前也投过几十个项目，有的金额也不小。所以，并非像外界想象的，腾讯到现在才开始大笔投资。当然，现在数量大一点是因为我们的资金实力比以前强一些。这两年的收入、利润和现金流比较大，能够支持我们更大的动作。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　投资范畴方面，我们希望向产业链上游去走。因为我们大家都在中间，竞争会遇到很多瓶颈。比如：我们投资旅游业，事实上也是选择了一个合作伙伴，今后QQ平台上订房、订机票可以全部交给它。我觉得这是一个战略合作。在内容方面，要支持我们其他的产业链，比如微博、社交等平台都需要明星、娱乐等资源。我们希望通过投资有一个和谐稳定的发展关系，不要等上游突然停掉，对方就要个天价，付不起。所以，如果从财务角度来说划算，加上有战略意义，我们认为就可以做。</font></p>
<p style="margin: 14px 0px; padding: 0px;"><font color="#000000">　　回顾过去，很多人认为腾讯很多成功就是因为有了一个QQ客户端软件。我们能够非常便捷接触到用户，手中有很多用户推什么产品都可以成功。但是，在未来，这种故事将不再存在。</font></p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/live/232.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=232</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[转] 如何在C语言中巧用正则表达式]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=17" label="Coding" /> 
	  <updated>2011-08-27T03:18:25+08:00</updated>
	  <published>2011-08-27T03:18:25+08:00</published>
		  <summary type="html"><![CDATA[看到大家讨论这方面的东西，作点贡献聊表各位高手对这个版快的无私奉献&nbsp;&nbsp;<br/><br/>如果用户熟悉Linux下的sed、awk、grep或vi，那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度，因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利，作为C语言程序员，用户同样可以在自己的程序中运用正则表达式。 <br/><br/>标准的C和C++都不支持正则表达式，但有一些函数库可以辅助C/C++程序员完成这一功能，其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库，许多Linux发行版本都带有这个函数库。 <br/><br/>编译正则表达式 <br/><br/>为了提高效率，在将一个字符串与正则表达式进行比较之前，首先要用regcomp()函数对它进行编译，将其转化为regex_t结构： <br/><br/>int regcomp(regex_t *preg, const char *regex, int cflags);<br/><br/><br/><br/>参数regex是一个字符串，它代表将要被编译的正则表达式；参数preg指向一个声明为regex_t的数据结构，用来保存编译结果；参数cflags决定了正则表达式该如何被处理的细节。 <br/><br/>如果函数regcomp()执行成功，并且编译结果被正确填充到preg中后，函数将返回0，任何其它的返回结果都代表有某种错误产生。 <br/><br/>匹配正则表达式 <br/><br/>一旦用regcomp()函数成功地编译了正则表达式，接下来就可以调用regexec()函数完成模式匹配： <br/><br/>int regexec(const&nbsp;&nbsp;regex_t&nbsp;&nbsp;*preg,&nbsp;&nbsp;const&nbsp;&nbsp;char *string, size_t nmatch,regmatch_t pmatch[], int eflags);<br/>typedef struct {<br/>&nbsp;&nbsp;regoff_t rm_so;<br/>&nbsp;&nbsp;regoff_t rm_eo;<br/>} regmatch_t;<br/><br/><br/><br/>参数preg指向编译后的正则表达式，参数string是将要进行匹配的字符串，而参数nmatch和pmatch则用于把匹配结果返回给调用程序，最后一个参数eflags决定了匹配的细节。 <br/><br/>在调用函数regexec()进行模式匹配的过程中，可能在字符串string中会有多处与给定的正则表达式相匹配，参数pmatch就是用来保存这些匹配位置的，而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返回时，从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串，而从string+pmatch[1].rm_so到string+pmatch[1].rm_eo，则是第二个匹配的字符串，依此类推。 <br/><br/>释放正则表达式 <br/><br/>无论什么时候，当不再需要已经编译过的正则表达式时，都应该调用函数regfree()将其释放，以免产生内存泄漏。 <br/><br/>void regfree(regex_t *preg);<br/><br/><br/><br/>函数regfree()不会返回任何结果，它仅接收一个指向regex_t数据类型的指针，这是之前调用regcomp()函数所得到的编译结果。 <br/><br/>如果在程序中针对同一个regex_t结构调用了多次regcomp()函数，POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放，但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数，以尽早释放占用的存储空间。 <br/><br/>报告错误信息 <br/><br/>如果调用函数regcomp()或regexec()得到的是一个非0的返回值，则表明在对正则表达式的处理过程中出现了某种错误，此时可以通过调用函数regerror()得到详细的错误信息。 <br/><br/>size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);<br/><br/><br/><br/>参数errcode是来自函数regcomp()或regexec()的错误代码，而参数preg则是由函数regcomp()得到的编译结果，其目的是把格式化消息所必须的上下文提供给regerror()函数。在执行函数regerror()时，将按照参数errbuf_size指明的最大字节数，在errbuf缓冲区中填入格式化后的错误信息，同时返回错误信息的长度。 <br/><br/>应用正则表达式 <br/><br/>最后给出一个具体的实例，介绍如何在C语言程序中处理正则表达式。 <br/><br/>#include &lt;stdio.h&gt;;<br/>#include &lt;sys/types.h&gt;;<br/>#include &lt;regex.h&gt;;<br/><br/>/* 取子串的函数 */<br/>static char* substr(const char*str, unsigned start, unsigned end)<br/>{<br/>&nbsp;&nbsp;unsigned n = end - start;<br/>&nbsp;&nbsp;static char stbuf[256];<br/>&nbsp;&nbsp;strncpy(stbuf, str + start, n);<br/>&nbsp;&nbsp;stbuf[n] = 0;<br/>&nbsp;&nbsp;return stbuf;<br/>}<br/>/* 主程序 */<br/>int main(int argc, char** argv)<br/>{<br/>&nbsp;&nbsp;char * pattern;<br/>&nbsp;&nbsp;int x, z, lno = 0, cflags = 0;<br/>&nbsp;&nbsp;char ebuf[128], lbuf[256];<br/>&nbsp;&nbsp;regex_t reg;<br/>&nbsp;&nbsp;regmatch_t pm[10];<br/>&nbsp;&nbsp;const size_t nmatch = 10;<br/>&nbsp;&nbsp;/* 编译正则表达式*/<br/>&nbsp;&nbsp;pattern = argv[1];<br/>&nbsp;&nbsp;z = regcomp(®, pattern, cflags);<br/>&nbsp;&nbsp;if (z != 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;regerror(z, ®, ebuf, sizeof(ebuf));<br/>&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, &#34;%s: pattern &#39;%s&#39; \n&#34;, ebuf, pattern);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;/*&nbsp;&nbsp;逐行处理输入的数据 */<br/>&nbsp;&nbsp;while(fgets(lbuf, sizeof(lbuf), stdin)) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;++lno;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ((z = strlen(lbuf)) &gt;; 0 &amp;&amp; lbuf[z-1] == &#39;\n&#39;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbuf[z - 1] = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* 对每一行应用正则表达式进行匹配 */<br/>&nbsp;&nbsp;&nbsp;&nbsp;z = regexec(®, lbuf, nmatch, pm, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (z == REG_NOMATCH) continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if (z != 0) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regerror(z, ®, ebuf, sizeof(ebuf));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, &#34;%s: regcom(&#39;%s&#39;)\n&#34;, ebuf, lbuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* 输出处理结果 */<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (x = 0; x &lt; nmatch &amp;&amp; pm[x].rm_so != -1; ++ x) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!x) printf(&#34;%04d: %s\n&#34;, lno, lbuf);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#34;&nbsp;&nbsp;$%d=&#39;%s&#39;\n&#34;, x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;/* 释放正则表达式&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;regfree(®);<br/>&nbsp;&nbsp;return 0;<br/>}<br/><br/><br/><br/>上述程序负责从命令行获取正则表达式，然后将其运用于从标准输入得到的每行数据，并打印出匹配结果。执行下面的命令可以编译并执行该程序： <br/><br/>#&nbsp;&nbsp;gcc regexp.c -o regexp<br/>#&nbsp;&nbsp;./regexp&nbsp;&nbsp;&#39;regex[a-z]*&#39; &lt; regexp.c<br/>0003: #include &lt;regex.h&gt;;<br/>&nbsp;&nbsp;$0=&#39;regex&#39;<br/>0027:&nbsp;&nbsp; regex_t reg;<br/>&nbsp;&nbsp;$0=&#39;regex&#39;<br/>0054:&nbsp;&nbsp;&nbsp;&nbsp; z = regexec(®, lbuf, nmatch, pm, 0);<br/>&nbsp;&nbsp;$0=&#39;regexec&#39;<br/><br/><br/>小结 <br/><br/>对那些需要进行复杂数据处理的程序来说，正则表达式无疑是一个非常有用的工具。本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理，以便在数据处理方面能够获得与Perl语言类似的灵活性。<br/><br/>原文地址：<a href="http://www.chinaunix.net/jh/23/303346.html" target="_blank" rel="external">http://www.chinaunix.net/jh/23/303346.html</a>]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/coding/231.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=231</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Stay hungry, Stay foolish]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=8" label="Live" /> 
	  <updated>2011-06-16T20:34:22+08:00</updated>
	  <published>2011-06-16T20:34:22+08:00</published>
		  <summary type="html"><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;1. 物有所不足，智有所不明。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;2. 求知若饥，虚心若愚。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;3. 常保饥渴求知，常存虚怀若愚。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;4. 好学若饥，谦卑若愚。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;5. 求知永若渴，大智常若愚。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;6. 保持饥饿，保持愚蠢。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;7. 若饥若渴，大智若愚。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;8. 留饿，留憨。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;9. 不进则退，停下来会变的很饿，会更愚蠢，一定要积极进取。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;10. 永远保持对成功，对理想的渴望，敢于犯错，不怕別人耻笑，做自己钟爱的事。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;11. 进取，执著。<br/>&nbsp;&nbsp;&nbsp;&nbsp;12. 我傻我知道，我穷我努力。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;13. 保持渴望，保持傻气。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;14. 坚持疯劲，坚持傻劲。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;15. 虚其心而实其腹。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;16. 装傻充愣，混吃蒙喝。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<a target="_blank" href="http://www.xyzlove.com/xyzloveEye/xyzlove__sq__wd_StayHungry_StayFoolish_dlj.htm" rel="external">猛击查看原文</a>]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/live/230.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=230</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[javascript代码性能优化]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=19" label="Website" /> 
	  <updated>2011-06-08T11:42:56+08:00</updated>
	  <published>2011-06-08T11:42:56+08:00</published>
		  <summary type="html"><![CDATA[网上一些文章觉得挺有用，把主要思想摘录下来。<br/><br/><strong><a target="_blank" href="http://www.ilovejs.net/archives/878" rel="external">javascript代码性能优化 by西红柿爱番茄</a></strong><br/><img src="http://www.ilovejs.net/wp-content/uploads/2010/06/performance.png" border="0" alt=""/><br/>Javascript代码优化无非主要围绕：DOM操作、循环、闭包、对象重复出现、对象的声明方式、作用域链、字符串操作、类的声明方式等等。循环、闭包、对象重复出现是从作用域链的角度去优化的；DOM操作主要围绕HTMLCollection、NodeList等来优化；对象的声明方式主要是对象（Object）、数组（Array）、字符串（String）、函数（Function）、正则（RegExp）等内置的对象使用字面量的方式来声明，这个比使用new来实例化相应的对象在性能上要强很多；字符串操作的优化方式主要是通过数组的push和join方法；类的声明方式优化方式主要是分清属性和方法的声明的方式，方法使用prototype的方式来声明；Javascript语言本身的流程操作语句的优化（if、switch、with、eval等等）。<br/><br/>因此，我将Javascript代码优化主要分为六类：DOM“真空”空间、缩短作用域链、字面量声明方式、字符串操作、类声明方式、流程操作语句。<br/><br/><br/><br/><strong><a target="_blank" href="http://www.kacakong.com/archives/298" rel="external">浮光掠影（第1季）：高性能JavaScript实践 by一刀倾城</a></strong><br/>1. 避免Javascript加载时Block引起的阻塞<br/>2. 尽可能的使用局部变量<br/>3. 多使用ID选择器，少使用CSS选择器<br/>4. 不要轻易获取布局信息<br/>5. 使用冒泡机制减少事件绑定次数<br/>6. 慎用定时器<br/>7. 优化效果不明显的那些技巧<br/>8. 推荐的性能测试工具FireJSPT<br/>9. 推荐的网站性能优化方面的书<br/><br/><strong><a target="_blank" href="http://www.woiweb.net/efficient-javascri&#112;t.html" rel="external">高效 JavaScript by我爱互联网</a></strong><br/>ECMAScript<br/>&nbsp;&nbsp;1. 避免使用 eval 或 Function 构造函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;1. 重写 eval<br/>&nbsp;&nbsp;&nbsp;&nbsp;2. 如果你需要函数，那就用函数<br/>&nbsp;&nbsp;2. 避免使用 with<br/>&nbsp;&nbsp;3. 不要在影响性能的关键函数中使用 try-catch-finally<br/>&nbsp;&nbsp;4. 分隔 eval 和 with<br/>&nbsp;&nbsp;5. 避免使用全局变量<br/>&nbsp;&nbsp;6. 注意隐式对象转换<br/>&nbsp;&nbsp;7. 在关键函数中避免 for-in<br/>&nbsp;&nbsp;8. 优化 string 合并<br/>&nbsp;&nbsp;9. 基本运算符比函数调用更快<br/> 10. 向 setTimeout() 和 setInterval()传送函数名，而不要传送字符串<br/><br/>DOM<br/>&nbsp;&nbsp;1. 重绘和 reflow<br/>&nbsp;&nbsp;2. 减少 reflow 次数<br/>&nbsp;&nbsp;3. 最小化 reflow 影响<br/>&nbsp;&nbsp;4. 修改 DOM 树<br/>&nbsp;&nbsp;5. 修改不可见元素<br/>&nbsp;&nbsp;6. 测量大小<br/>&nbsp;&nbsp;7. 一次修改多个样式值<br/>&nbsp;&nbsp;8. 用流畅性换取速度<br/>&nbsp;&nbsp;9. 避免搜索大量节点<br/> 10. 使用 XPath 提高速度<br/> 11. 避免在遍历 DOM 时修改 DOM<br/> 12. 使用变量保存 DOM 值<br/><br/>页面载入<br/>&nbsp;&nbsp;1. 避免保存来自其他文档的引用<br/>&nbsp;&nbsp;2. 快速历史浏览<br/>&nbsp;&nbsp;3. 使用 XMLHttpRequest<br/>&nbsp;&nbsp;4. 动态创建 SCRIPT 元素<br/>&nbsp;&nbsp;5. location.replace() 控制历史项]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/website/229.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=229</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[吐槽一下工信部的新备案系统]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=19" label="Website" /> 
	  <updated>2011-06-06T16:35:48+08:00</updated>
	  <published>2011-06-06T16:35:48+08:00</published>
		  <summary type="html"><![CDATA[自从工信部换了新的备案系统后，一直不知道怎么登录备案系统，今天看了以下文字才知道该怎么登录。<br/><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="https://kanoe.cn/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">很多用户找<strong>通信管理局找回备案密码</strong>后，总反映说无法登陆系统。这里需要澄清的是，根据原来旧备案系统，通过用户名密码是可以直接登录的。但备案系统升级之后，改成了<strong>部、省、企业三级架构</strong>，用户要登录查看备案信息及备案状态，只能通过企业侧系统登录。因此，新的备案系统架构中，<strong>密码包含两层</strong>：一是登录企业侧系统的密码，用户登录不同的企业侧系统可以自行设定，登录企业侧系统的密码找回、修改和重置由接入商系统和接入商负责；二是备案密码，即只有在接入商修改备案信息、注销备案等才使用该密码。该密码并不用来登陆企业侧备案系统。<strong>管局重置的是备案密码，并非用来登录的</strong>。</div></div>引自：<a href="http://www.beianwo.com/zhaohuimimadenglubul.html" target="_blank" rel="external">http://www.beianwo.com/zhaohuimimadenglubul.html</a><br/><br/>我看完后只能骂一句，工信部吃饱没事撑着！原本一站式的登录居然现在分了这么多层，让我们折腾那么久！这样转来转去不烦么？能不能设计个更人性化的系统呢？纳税人的钱怎么花的？<br/><br/>还有工信部的备案系统不是一般的慢，经常访问不了！<br/><br/>而且我现在还得去接入商那里找回企业系统的登录用户名密码，囧。<br/><br/>我想以上文字不会被封吧，阿门！]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/website/228.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=228</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[创造无限，输出++]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=8" label="Live" /> 
	  <updated>2011-06-06T11:05:54+08:00</updated>
	  <published>2011-06-06T11:05:54+08:00</published>
		  <summary type="html"><![CDATA[又到毕业季，看了下今年送旧晚会，包括节目和晚会安排，都觉得很不错，以前老是觉得好idea都被人用过了，但是看完后才觉得（像何书记说的那样），咋环院的人真是太有才了！<br/><br/>有道是：<br/>创造无限，输出++<br/><br/>干爸爹！<br/><br/>附上门票和一些录影：<br/><img src="https://kanoe.cn/attachments/month_1106/6201166105948.jpg" border="0" alt=""/><br/><img src="https://kanoe.cn/attachments/month_1106/2201166105937.jpg" border="0" alt=""/><br/><br/>中大环院送旧晚会 非诚勿扰<br/><div class="UBBPanel"><div class="UBBTitle"><img src="https://kanoe.cn/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><a id="temp48033_href" href="https://kanoe.cn/javascript:MediaShow('swf','temp48033','http://player.youku.com/player.php/sid/XMjcyNjY1NDYw/v.swf','600','480')"><img name="temp48033_img" src="https://kanoe.cn/images/mm_snd.gif" style="margin:0px 3px -2px 0px" border="0" alt=""/><span id="temp48033_text">在线播放</span></a><div id="temp48033"></div></div></div><br/><br/>中大环院送旧晚会 若爱只是擦肩而过<br/><div class="UBBPanel"><div class="UBBTitle"><img src="https://kanoe.cn/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><a id="temp93558_href" href="https://kanoe.cn/javascript:MediaShow('swf','temp93558','http://player.youku.com/player.php/sid/XMjcyNjY0OTk2/v.swf','600','520')"><img name="temp93558_img" src="https://kanoe.cn/images/mm_snd.gif" style="margin:0px 3px -2px 0px" border="0" alt=""/><span id="temp93558_text">在线播放</span></a><div id="temp93558"></div></div></div><br/><br/>PS:有一点比较遗憾，那晚我忘了去，只能看录像了，现场气氛神马的感受不到]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/live/227.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=227</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Javascript私有方法中this的引用]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=19" label="Website" /> 
	  <updated>2011-06-05T02:19:48+08:00</updated>
	  <published>2011-06-05T02:19:48+08:00</published>
		  <summary type="html"><![CDATA[《Javascript Dom高级程序设计》提到“私有方法是存在于构造函数作用域的自包含的（self-contained）对象，它们实际上并不是prototype的方法，因此在私有方法内部this引用的只是私有方法的实例，而非myConstructor（一个构造器函数）的实例。”<br/><br/>this真的是引用私有方法的实例吗？先看一段示例：<br/><textarea name="code" class="JavaScript">function a()
{
  function b()
  {
    alert(this==window);  //true
    function c()
    {
      alert(this==window);  //true
      function d()
      {
        alert(this==window);  //true
      }
      d();
    }
    c();
  }

  b();
}

new a();</textarea><br/>示例里面都返回true，说明this引用的的window对象，不是私有方法的实例。示例里面嵌套了3层私有函数，是否所有情况都引用window对象有待继续探究。]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/website/226.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=226</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[prototype 原型链]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=19" label="Website" /> 
	  <updated>2011-06-02T15:10:21+08:00</updated>
	  <published>2011-06-02T15:10:21+08:00</published>
		  <summary type="html"><![CDATA[prototype源自法语，软件界的标准翻译为“原型”，代表事物的初始形态，也含有模型和样板的意义。JavaScript中的prototype概念恰如其分地反映了这个词的内含，我们不能将其理解为C++的prototype那种预先声明的概念。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;JavaScript的所有function类型的对象都有一个prototype属性。这个prototype属性本身又是一个object类型的对象，因此我们也可以给这个prototype对象添加任意的属性和方法。既然prototype是对象的“原型”，那么由该函数构造出来的对象应该都会具有这个“原型”的特性。事实上，在构造函数的prototype上定义的所有属性和方法，都是可以通过其构造的对象直接访问和调用的。也可以这么说，prototype提供了一群同类对象共享属性和方法的机制。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;我们先来看看下面的代码： <br/>&nbsp;&nbsp;&nbsp;&nbsp;function Person(name) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name;&nbsp;&nbsp; //设置对象属性，每个对象各自一份属性数据 <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello = function() //给Person函数的prototype添加SayHello方法。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = new Person(&#34;Bill Gates&#34;);&nbsp;&nbsp; //创建BillGates对象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;var SteveJobs = new Person(&#34;Steve Jobs&#34;);&nbsp;&nbsp; //创建SteveJobs对象 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp; //通过BillGates对象直接调用到SayHello方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp; //通过SteveJobs对象直接调用到SayHello方法 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello == SteveJobs.SayHello); //因为两个对象是共享prototype的SayHello，所以显示：true <br/>&nbsp;&nbsp;&nbsp;&nbsp;程序运行的结果表明，构造函数的prototype上定义的方法确实可以通过对象直接调用到，而且代码是共享的。显然，把方法设置到prototype的写法显得优雅多了，尽管调用形式没有变，但逻辑上却体现了方法与类的关系，相对前面的写法，更容易理解和组织代码。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;那么，对于多层次类型的构造函数情况又如何呢？ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;我们再来看下面的代码： <br/>1&nbsp;&nbsp;&nbsp;&nbsp; function Person(name)&nbsp;&nbsp; //基类构造函数 <br/>2&nbsp;&nbsp;&nbsp;&nbsp; { <br/>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name; <br/>4&nbsp;&nbsp;&nbsp;&nbsp; }; <br/>5&nbsp;&nbsp;&nbsp;&nbsp; <br/>6&nbsp;&nbsp;&nbsp;&nbsp; Person.prototype.SayHello = function() //给基类构造函数的prototype添加方法 <br/>7&nbsp;&nbsp;&nbsp;&nbsp; { <br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&#34;Hello, I&#39;m &#34; + this.name); <br/>9&nbsp;&nbsp;&nbsp;&nbsp; }; <br/>10&nbsp;&nbsp;&nbsp;&nbsp; <br/>11&nbsp;&nbsp;&nbsp;&nbsp; function Employee(name, salary) //子类构造函数 <br/>12&nbsp;&nbsp;&nbsp;&nbsp; { <br/>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person.call(this, name);&nbsp;&nbsp;&nbsp;&nbsp;//调用基类构造函数 <br/>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.salary = salary; <br/>15&nbsp;&nbsp;&nbsp;&nbsp; }; <br/>16&nbsp;&nbsp;&nbsp;&nbsp; <br/>17&nbsp;&nbsp;&nbsp;&nbsp; Employee.prototype = new Person(); //建一个基类的对象作为子类原型的原型，这里很有意思 <br/>18&nbsp;&nbsp;&nbsp;&nbsp; <br/>19&nbsp;&nbsp;&nbsp;&nbsp; Employee.prototype.ShowMeTheMoney = function() //给子类添构造函数的prototype添加方法 <br/>20&nbsp;&nbsp;&nbsp;&nbsp; { <br/>21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(this.name + &#34; $&#34; + this.salary); <br/>22&nbsp;&nbsp;&nbsp;&nbsp; }; <br/>23 <br/>24&nbsp;&nbsp;&nbsp;&nbsp; var BillGates = new Person(&#34;Bill Gates&#34;);&nbsp;&nbsp; //创建基类Person的BillGates对象 <br/>25&nbsp;&nbsp;&nbsp;&nbsp; var SteveJobs = new Employee(&#34;Steve Jobs&#34;, 1234);&nbsp;&nbsp; //创建子类Employee的SteveJobs对象 <br/>26 <br/>27&nbsp;&nbsp;&nbsp;&nbsp; BillGates.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通过对象直接调用到prototype的方法 <br/>28&nbsp;&nbsp;&nbsp;&nbsp; SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通过子类对象直接调用基类prototype的方法，关注！ <br/>29&nbsp;&nbsp;&nbsp;&nbsp; SteveJobs.ShowMeTheMoney(); //通过子类对象直接调用子类prototype的方法 <br/>30 <br/>31&nbsp;&nbsp;&nbsp;&nbsp; alert(BillGates.SayHello == SteveJobs.SayHello); //显示：true，表明prototype的方法是共享的 <br/>&nbsp;&nbsp;&nbsp;&nbsp;这段代码的第17行，构造了一个基类的对象，并将其设为子类构造函数的prototype，这是很有意思的。这样做的目的就是为了第28行，通过子类对象也可以直接调用基类prototype的方法。为什么可以这样呢？ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;原来，在JavaScript中，prototype不但能让对象共享自己财富，而且prototype还有寻根问祖的天性，从而使得先辈们的遗产可以代代相传。当从一个对象那里读取属性或调用方法时，如果该对象自身不存在这样的属性或方法，就会去自己关联的prototype对象那里寻找；如果prototype没有，又会去prototype自己关联的前辈prototype那里寻找，直到找到或追溯过程结束为止。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在JavaScript内部，对象的属性和方法追溯机制是通过所谓的prototype链来实现的。当用new操作符构造对象时，也会同时将构造函数的prototype对象指派给新创建的对象，成为该对象内置的原型对象。对象内置的原型对象应该是对外不可见的，尽管有些浏览器(如Firefox)可以让我们访问这个内置原型对象，但并不建议这样做。内置的原型对象本身也是对象，也有自己关联的原型对象，这样就形成了所谓的原型链。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在原型链的最末端，就是Object构造函数prototype属性指向的那一个原型对象。这个原型对象是所有对象的最老祖先，这个老祖宗实现了诸如toString等所有对象天生就该具有的方法。其他内置构造函数，如Function, Boolean, String, Date和RegExp等的prototype都是从这个老祖宗传承下来的，但他们各自又定义了自身的属性和方法，从而他们的子孙就表现出各自宗族的那些特征。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这不就是“继承”吗？是的，这就是“继承”，是JavaScript特有的“原型继承”。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;“原型继承”是慈祥而又严厉的。原形对象将自己的属性和方法无私地贡献给孩子们使用，也并不强迫孩子们必须遵从，允许一些顽皮孩子按自己的兴趣和爱好独立行事。从这点上看，原型对象是一位慈祥的母亲。然而，任何一个孩子虽然可以我行我素，但却不能动原型对象既有的财产，因为那可能会影响到其他孩子的利益。从这一点上看，原型对象又象一位严厉的父亲。我们来看看下面的代码就可以理解这个意思了： <br/>&nbsp;&nbsp;&nbsp;&nbsp;function Person(name) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.company = &#34;Microsoft&#34;; //原型的属性 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello = function() //原型的方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name + &#34; of &#34; + this.company); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = new Person(&#34;Bill Gates&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp; //由于继承了原型的东西，规规矩矩输出：Hello, I&#39;m Bill Gates <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var SteveJobs = new Person(&#34;Steve Jobs&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.company = &#34;Apple&#34;;&nbsp;&nbsp;&nbsp;&nbsp;//设置自己的company属性，掩盖了原型的company属性 <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello = function() //实现了自己的SayHello方法，掩盖了原型的SayHello方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hi, &#34; + this.name + &#34; like &#34; + this.company + &#34;, ha ha ha &#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp; //都是自己覆盖的属性和方法，输出：Hi, Steve Jobs like Apple, ha ha ha <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp; //SteveJobs的覆盖没有影响原型对象，BillGates还是按老样子输出 <br/>&nbsp;&nbsp;&nbsp;&nbsp;对象可以掩盖原型对象的那些属性和方法，一个构造函数原型对象也可以掩盖上层构造函数原型对象既有的属性和方法。这种掩盖其实只是在对象自己身上创建了新的属性和方法，只不过这些属性和方法与原型对象的那些同名而已。JavaScript就是用这简单的掩盖机制实现了对象的“多态”性，与静态对象语言的虚函数和重载(override)概念不谋而合。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;然而，比静态对象语言更神奇的是，我们可以随时给原型对象动态添加新的属性和方法，从而动态地扩展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码： <br/>&nbsp;&nbsp;&nbsp;&nbsp;function Person(name) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello = function() //建立对象前定义的方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = new Person(&#34;Bill Gates&#34;);&nbsp;&nbsp; //建立对象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.Retire = function()&nbsp;&nbsp;&nbsp;&nbsp;//建立对象后再动态扩展原型的方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Poor &#34; + this.name + &#34;, bye bye!&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.Retire(); //动态扩展的方法即可被先前建立的对象立即调用 <br/>&nbsp;&nbsp;&nbsp;&nbsp;阿弥佗佛，原型继承竟然可以玩出有这样的法术！ <br/><br/>原型扩展 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;想必君的悟性极高，可能你会这样想：如果在JavaScript内置的那些如Object和Function等函数的prototype上添加些新的方法和属性，是不是就能扩展JavaScript的功能呢？ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;那么，恭喜你，你得到了！ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在AJAX技术迅猛发展的今天，许多成功的AJAX项目的JavaScript运行库都大量扩展了内置函数的prototype功能。比如微软的ASP.NET AJAX，就给这些内置函数及其prototype添加了大量的新特性，从而增强了JavaScript的功能。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;我们来看一段摘自MicrosoftAjax.debug.js中的代码： <br/><br/>String.prototype.trim = function String$trim() { <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (arguments.length !== 0) throw Error.parameterCount(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;return this.replace(/^\s+|\s+$/g, &#39;&#39;); <br/>} <br/>&nbsp;&nbsp;&nbsp;&nbsp;这段代码就是给内置String函数的prototype扩展了一个trim方法，于是所有的String类对象都有了trim方法了。有了这个扩展，今后要去除字符串两段的空白，就不用再分别处理了，因为任何字符串都有了这个扩展功能，只要调用即可，真的很方便。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;当然，几乎很少有人去给Object的prototype添加方法，因为那会影响到所有的对象，除非在你的架构中这种方法的确是所有对象都需要的。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;前两年，微软在设计AJAX类库的初期，用了一种被称为“闭包”(closure)的技术来模拟“类”。其大致模型如下： <br/>&nbsp;&nbsp;&nbsp;&nbsp;function Person(firstName, lastName, age) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//私有变量： <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var _firstName = firstName; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var _lastName = lastName; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//公共变量: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age = age; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//方法： <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.getName = function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(firstName + &#34; &#34; + lastName); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.SayHello = function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + firstName + &#34; &#34; + lastName); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = new Person(&#34;Bill&#34;, &#34;Gates&#34;, 53); <br/>&nbsp;&nbsp;&nbsp;&nbsp;var SteveJobs = new Person(&#34;Steve&#34;, &#34;Jobs&#34;, 53); <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.getName() + &#34; &#34; + BillGates.age); <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.firstName);&nbsp;&nbsp;&nbsp;&nbsp; //这里不能访问到私有变量 <br/>&nbsp;&nbsp;&nbsp;&nbsp;很显然，这种模型的类描述特别象C#语言的描述形式，在一个构造函数里依次定义了私有成员、公共属性和可用的方法，显得非常优雅嘛。特别是“闭包”机制可以模拟对私有成员的保护机制，做得非常漂亮。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;所谓的“闭包”，就是在构造函数体内定义另外的函数作为目标对象的方法函数，而这个对象的方法函数反过来引用外层外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法，就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束，临时变量的名称也都消失了，但在目标对象的方法内却始终能引用到该变量的值，而且该值只能通这种方法来访问。即使再次调用相同的构造函数，但只会生成新对象和方法，新的临时变量只是对应新的值，和上次那次调用的是各自独立的。的确很巧妙！ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;但是前面我们说过，给每一个对象设置一份方法是一种很大的浪费。还有，“闭包”这种间接保持变量值的机制，往往会给JavaSript的垃圾回收器制造难题。特别是遇到对象间复杂的循环引用时，垃圾回收的判断逻辑非常复杂。无独有偶，IE浏览器早期版本确实存在JavaSript垃圾回收方面的内存泄漏问题。再加上“闭包”模型在性能测试方面的表现不佳，微软最终放弃了“闭包”模型，而改用“原型”模型。正所谓“有得必有失”嘛。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;原型模型需要一个构造函数来定义对象的成员，而方法却依附在该构造函数的原型上。大致写法如下： <br/>&nbsp;&nbsp;&nbsp;&nbsp;//定义构造函数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;function Person(name) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name;&nbsp;&nbsp; //在构造函数中定义成员 <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//方法定义到构造函数的prototype上 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello = function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name); <br/>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//子类构造函数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;function Employee(name, salary) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.call(this, name);&nbsp;&nbsp;&nbsp;&nbsp;//调用上层构造函数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.salary = salary;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //扩展的成员 <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//子类构造函数首先需要用上层构造函数来建立prototype对象，实现继承的概念 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype = new Person()&nbsp;&nbsp; //只需要其prototype的方法，此对象的成员没有任何意义！ <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//子类方法也定义到构造函数之上 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype.ShowMeTheMoney = function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name + &#34; $&#34; + this.salary); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = new Person(&#34;Bill Gates&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var SteveJobs = new Employee(&#34;Steve Jobs&#34;, 1234); <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;原型类模型虽然不能模拟真正的私有变量，而且也要分两部分来定义类，显得不怎么“优雅”。不过，对象间的方法是共享的，不会遇到垃圾回收问题，而且性能优于“闭包”模型。正所谓“有失必有得”嘛。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在原型模型中，为了实现类继承，必须首先将子类构造函数的prototype设置为一个父类的对象实例。创建这个父类对象实例的目的就是为了构成原型链，以起到共享上层原型方法作用。但创建这个实例对象时，上层构造函数也会给它设置对象成员，这些对象成员对于继承来说是没有意义的。虽然，我们也没有给构造函数传递参数，但确实创建了若干没有用的成员，尽管其值是undefined，这也是一种浪费啊。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;唉！世界上没有完美的事情啊！ <br/><br/>原型真谛 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;正当我们感概万分时，天空中一道红光闪过，祥云中出现了观音菩萨。只见她手持玉净瓶，轻拂翠柳枝，洒下几滴甘露，顿时让JavaScript又添新的灵气。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;观音洒下的甘露在JavaScript的世界里凝结成块，成为了一种称为“语法甘露”的东西。这种语法甘露可以让我们编写的代码看起来更象对象语言。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;要想知道这“语法甘露”为何物，就请君侧耳细听。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在理解这些语法甘露之前，我们需要重新再回顾一下JavaScript构造对象的过程。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;我们已经知道，用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步：第一步是建立一个新对象；第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象；第三步就是将该对象作为this参数调用构造函数，完成成员设置等初始化工作。对象建立之后，对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关，与构造函数再扯不上关系了。换句话说，构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;那么，我们能否自己定义一个对象来当作原型，并在这个原型上描述类，然后将这个原型设置给新创建的对象，将其当作对象的类呢？我们又能否将这个原型中的一个方法当作构造函数，去初始化新建的对象呢？例如，我们定义这样一个原型对象： <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var Person = //定义一个对象来作为原型类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate: function(name, age) //这个当构造函数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age = age; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHello: function() //定义方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HowOld: function() //定义方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name + &#34; is &#34; + this.age + &#34; years old.&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;这个JSON形式的写法多么象一个C#的类啊！既有构造函数，又有各种方法。如果可以用某种形式来创建对象，并将对象的内置的原型设置为上面这个“类”对象，不就相当于创建该类的对象了吗？ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;但遗憾的是，我们几乎不能访问到对象内置的原型属性！尽管有些浏览器可以访问到对象的内置原型，但这样做的话就只能限定了用户必须使用那种浏览器。这也几乎不可行。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;那么，我们可不可以通过一个函数对象来做媒介，利用该函数对象的prototype属性来中转这个原型，并用new操作符传递给新建的对象呢？ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;其实，象这样的代码就可以实现这一目标： <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;function anyfunc(){};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义一个函数躯壳 <br/>&nbsp;&nbsp;&nbsp;&nbsp;anyfunc.prototype = Person;&nbsp;&nbsp;&nbsp;&nbsp; //将原型对象放到中转站prototype <br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = new anyfunc(); //新建对象的内置原型将是我们期望的原型对象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;不过，这个anyfunc函数只是一个躯壳，在使用过这个躯壳之后它就成了多余的东西了，而且这和直接使用构造函数来创建对象也没啥不同，有点不爽。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;可是，如果我们将这些代码写成一个通用函数，而那个函数躯壳也就成了函数内的函数，这个内部函数不就可以在外层函数退出作用域后自动消亡吗？而且，我们可以将原型对象作为通用函数的参数，让通用函数返回创建的对象。我们需要的就是下面这个形式： <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;function New(aClass, aParams)&nbsp;&nbsp;&nbsp;&nbsp;//通用创建函数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function new_()&nbsp;&nbsp;&nbsp;&nbsp; //定义临时的中转函数壳 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aClass.Cr&#101;ate.apply(this, aParams);&nbsp;&nbsp; //调用原型中定义的的构造函数，中转构造逻辑及构造参数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_.prototype = aClass;&nbsp;&nbsp;&nbsp;&nbsp;//准备中转原型对象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new new_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回建立最终建立的对象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var Person =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义的类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate: function(name, age) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age = age; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHello: function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HowOld: function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name + &#34; is &#34; + this.age + &#34; years old.&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = New(Person, [&#34;Bill Gates&#34;, 53]); //调用通用函数创建对象，并以数组形式传递构造参数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.HowOld(); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.constructor == Object);&nbsp;&nbsp;&nbsp;&nbsp; //输出：true <br/>&nbsp;&nbsp;&nbsp;&nbsp;这里的通用函数New()就是一个“语法甘露”！这个语法甘露不但中转了原型对象，还中转了构造函数逻辑及构造参数。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;有趣的是，每次创建完对象退出New函数作用域时，临时的new_函数对象会被自动释放。由于new_的prototype属性被设置为新的原型对象，其原来的原型对象和new_之间就已解开了引用链，临时函数及其原来的原型对象都会被正确回收了。上面代码的最后一句证明，新创建的对象的constructor属性返回的是Object函数。其实新建的对象自己及其原型里没有constructor属性，那返回的只是最顶层原型对象的构造函数，即Object。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;有了New这个语法甘露，类的定义就很像C#那些静态对象语言的形式了，这样的代码显得多么文静而优雅啊！ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;当然，这个代码仅仅展示了“语法甘露”的概念。我们还需要多一些的语法甘露，才能实现用简洁而优雅的代码书写类层次及其继承关系。好了，我们再来看一个更丰富的示例吧： <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//语法甘露： <br/>&nbsp;&nbsp;&nbsp;&nbsp;var object =&nbsp;&nbsp;&nbsp;&nbsp;//定义小写的object基本类，用于实现最基础的方法等 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isA: function(aType)&nbsp;&nbsp; //一个判断类与类之间以及对象与类之间关系的基础方法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var self = this; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(self) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (self == aType) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self = self.Type; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;function Class(aBaseClass, aClassDefine)&nbsp;&nbsp;&nbsp;&nbsp;//创建类的函数，用于声明类及继承关系 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function class_()&nbsp;&nbsp; //创建类的临时函数壳 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Type = aBaseClass;&nbsp;&nbsp;&nbsp;&nbsp;//我们给每一个类约定一个Type属性，引用其继承的类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var member in aClassDefine) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this[member] = aClassDefine[member];&nbsp;&nbsp;&nbsp;&nbsp;//复制类的全部定义到当前创建的类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_.prototype = aBaseClass; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new class_(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;function New(aClass, aParams)&nbsp;&nbsp; //创建对象的函数，用于任意类的对象创建 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function new_()&nbsp;&nbsp;&nbsp;&nbsp; //创建对象的临时函数壳 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Type = aClass;&nbsp;&nbsp;&nbsp;&nbsp;//我们也给每一个对象约定一个Type属性，据此可以访问到对象所属的类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (aClass.Cr&#101;ate) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aClass.Cr&#101;ate.apply(this, aParams);&nbsp;&nbsp; //我们约定所有类的构造函数都叫Cr&#101;ate，这和DELPHI比较相似 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_.prototype = aClass; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new new_(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;}; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//语法甘露的应用效果：&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var Person = Class(object,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//派生至object基本类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate: function(name, age) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age = age; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHello: function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#34;Hello, I&#39;m &#34; + this.name + &#34;, &#34; + this.age + &#34; years old.&#34;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;}); <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var Employee = Class(Person,&nbsp;&nbsp;&nbsp;&nbsp;//派生至Person类，是不是和一般对象语言很相似？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate: function(name, age, salary) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.Cr&#101;ate.call(this, name, age); //调用基类的构造函数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.salary = salary; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMeTheMoney: function() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name + &#34; $&#34; + this.salary); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;}); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var BillGates = New(Person, [&#34;Bill Gates&#34;, 53]); <br/>&nbsp;&nbsp;&nbsp;&nbsp;var SteveJobs = New(Employee, [&#34;Steve Jobs&#34;, 53, 1234]); <br/>&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var LittleBill = New(BillGates.Type, [&#34;Little Bill&#34;, 6]);&nbsp;&nbsp; //根据BillGate的类型创建LittleBill <br/>&nbsp;&nbsp;&nbsp;&nbsp;LittleBill.SayHello(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.isA(Person));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //true <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.isA(Employee));&nbsp;&nbsp;&nbsp;&nbsp; //false <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(SteveJobs.isA(Person));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //true <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(Person.isA(Employee));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//false <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(Employee.isA(Person));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//true <br/>&nbsp;&nbsp;&nbsp;&nbsp;“语法甘露”不用太多，只要那么一点点，就能改观整个代码的易读性和流畅性，从而让代码显得更优雅。有了这些语法甘露，JavaScript就很像一般对象语言了，写起代码了感觉也就爽多了！ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;令人高兴的是，受这些甘露滋养的JavaScript程序效率会更高。因为其原型对象里既没有了毫无用处的那些对象级的成员，而且还不存在constructor属性体，少了与构造函数间的牵连，但依旧保持了方法的共享性。这让JavaScript在追溯原型链和搜索属性及方法时，少费许多工夫啊。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;我们就把这种形式称为“甘露模型”吧！其实，这种“甘露模型”的原型用法才是符合prototype概念的本意，才是的JavaScript原型的真谛！ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;想必微软那些设计AJAX架构的工程师看到这个甘露模型时，肯定后悔没有早点把AJAX部门从美国搬到咱中国的观音庙来，错过了观音菩萨的点化。当然，我们也只能是在代码的示例中，把Bill Gates当作对象玩玩，真要让他放弃上帝转而皈依我佛肯定是不容易的，机缘未到啊！如果哪天你在微软新出的AJAX类库中看到这种甘露模型，那才是真正的缘分！ <br/><br/>编程的快乐 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在软件工业迅猛发展的今天，各式各样的编程语言层出不穷，新语言的诞生，旧语言的演化，似乎已经让我们眼花缭乱。为了适应面向对象编程的潮流，JavaScript语言也在向完全面向对象的方向发展，新的JavaScript标准已经从语义上扩展了许多面向对象的新元素。与此相反的是，许多静态的对象语言也在向JavaScript的那种简洁而幽雅的方向发展。例如，新版本的C#语言就吸收了JSON那样的简洁表示法，以及一些其他形式的JavaScript特性。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;我们应该看到，随着RIA(强互联应用)的发展和普及，AJAX技术也将逐渐淡出江湖，JavaScript也将最终消失或演化成其他形式的语言。但不管编程语言如何发展和演化，编程世界永远都会在“数据”与“代码”这千丝万缕的纠缠中保持着无限的生机。只要我们能看透这一点，我们就能很容易地学习和理解软件世界的各种新事物。不管是已熟悉的过程式编程，还是正在发展的函数式编程，以及未来量子纠缠态的大规模并行式编程，我们都有足够的法力来化解一切复杂的难题。 <br/><br/>来源：<a href="http://www.zhuoda.org/lunzi/101543.html" target="_blank" rel="external">http://www.zhuoda.org/lunzi/101543.html</a><br/><br/>后记：《Ajax实战》中提到，原型机制可以看成是一种求取默认值的机制，这是另一方面的理解。]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/website/225.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=225</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[终结]]></title>
	  <author>
		 <name>独木舟</name>
		 <uri>https://kanoe.cn/</uri>
		 <email>master@kanoe.cn</email>
	  </author>
	  <category term="" scheme="https://kanoe.cn/default.asp?cateID=8" label="Live" /> 
	  <updated>2011-05-29T16:52:21+08:00</updated>
	  <published>2011-05-29T16:52:21+08:00</published>
		  <summary type="html"><![CDATA[事情都有终结的一日。既是结束也是开始。琳妹妹说有梦想就能飞翔。渴望改变， do myself！<br/>勇敢踏出去，那天不远了。]]></summary>
	  <link rel="alternate" type="text/html" href="https://kanoe.cn/article/live/224.htm" /> 
	  <id>https://kanoe.cn/default.asp?id=224</id>
  </entry>	
		
</feed>
