<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>张经纬的博客</title>
	<atom:link href="http://www.zhangjingwei.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zhangjingwei.com</link>
	<description></description>
	<lastBuildDate>Fri, 14 Oct 2011 09:01:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>jQuery Select</title>
		<link>http://www.zhangjingwei.com/archives/jquery-select/</link>
		<comments>http://www.zhangjingwei.com/archives/jquery-select/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 16:03:35 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1762</guid>
		<description><![CDATA[TextMate下的中文看起来实在是费劲，所以就都去掉了。 使用很简单，select还是按照原来的BOM去写，然后构造对应DOM的jQuery对象，再调用selectinput方法即可。 BTW：下拉菜单的样式需要自己去写一下，对应的样式参数在conf.css这个对象下。 /* * Select zhangjingwei * Released under the MIT, BSD, and GPL Licenses. */ &#40;function &#40;$&#41; &#123; &#160; $.tools = $.tools &#124;&#124; &#123; version: '1.3' &#125;; &#160; var instances = &#91;&#93;, tool = $.tools.selectinput = &#123; conf: &#123; offset: 0, // 弹出菜单偏移量 trigger: false, // 默认触发 css: &#123; // ids root: 0, [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/jquery-select/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>新浪乐居招聘前端工程师</title>
		<link>http://www.zhangjingwei.com/archives/%e6%96%b0%e6%b5%aa%e4%b9%90%e5%b1%85%e6%8b%9b%e8%81%98%e5%89%8d%e7%ab%af%e5%b7%a5%e7%a8%8b%e5%b8%88/</link>
		<comments>http://www.zhangjingwei.com/archives/%e6%96%b0%e6%b5%aa%e4%b9%90%e5%b1%85%e6%8b%9b%e8%81%98%e5%89%8d%e7%ab%af%e5%b7%a5%e7%a8%8b%e5%b8%88/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 07:09:10 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[前端开发]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1757</guid>
		<description><![CDATA[朋友托付，代为招聘，新浪公司不表，乐居主要做房产相关，公司好，领导好，团队好。 直入正题，招聘前端工程师 要求： 1、常见技能都须满足，HTML,CSS是必须。 2、掌握javascript，有框架使用经验，有工程项目优先。 3、两年以上工作经验，硬性要求：专科以上学历。 待遇： 1、根据实际能力而定，能力好，挑战五位数月薪。 2、国家标准福利待遇，有补充医疗保险。（报90%） 3、14月薪（季度，年终），有加班费，有餐补，交通补，话费补，网费补，各种补。（不少！！！） 补充： 工作地点：北京（三元桥，海航大厦，东北三环） 有意愿加入的同学，别犹豫，直接简历到 hi@zhangjingwei.com]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e6%96%b0%e6%b5%aa%e4%b9%90%e5%b1%85%e6%8b%9b%e8%81%98%e5%89%8d%e7%ab%af%e5%b7%a5%e7%a8%8b%e5%b8%88/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>javascript 序列化</title>
		<link>http://www.zhangjingwei.com/archives/javascript-serialize/</link>
		<comments>http://www.zhangjingwei.com/archives/javascript-serialize/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 05:58:31 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1749</guid>
		<description><![CDATA[类似php中的serialize方法 BTW:当数据类型是null的时候,由于使用typeof 进行验证,所以会出现问题.(typeof null == &#8220;object&#8221;) // true function serialize&#40;_obj&#41; &#123; // Let Gecko browsers do this the easy way if &#40;typeof _obj.toSource !== 'undefined' &#38;&#38; typeof _obj.callee === 'undefined'&#41; &#123; return _obj.toSource&#40;&#41;; &#125; &#160; // Other browsers must do it the hard way switch &#40;typeof _obj&#41; &#123; // numbers, booleans, and functions are trivial: [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/javascript-serialize/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>闲谈 node （初探）</title>
		<link>http://www.zhangjingwei.com/archives/%e9%97%b2%e8%b0%88-node-%ef%bc%88%e5%88%9d%e6%8e%a2%ef%bc%89/</link>
		<comments>http://www.zhangjingwei.com/archives/%e9%97%b2%e8%b0%88-node-%ef%bc%88%e5%88%9d%e6%8e%a2%ef%bc%89/#comments</comments>
		<pubDate>Thu, 12 May 2011 08:37:03 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[前端开发]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1718</guid>
		<description><![CDATA[以前编写js的时候，总是在各种浏览器之间纠结，有时纠结兼容性问题，有时纠结性能或效率，很多时候看着后端工程师玩弄着各种数据心里就痒痒，只能感叹，js不给力。 不过在这一切都是浮云的世界，什么都在变，就和打麻将一样，风水轮流转，无论是Python还是Ruby，无论是BigTable或是Dynamo，就连CPU都尼玛从双核到四核，甚至把“显卡”也集成进去了，咱们的JS也应该发光发热了吧？ 是的，一切都很给力，node就是这样，它就这样诞生了。 node，一个JS的运行环境，一个放在服务器上的JS运行环境，没错，他不是放在浏览器上，他是能像PHP一样跑在服务器上的运行环境。：） 我看到面前的PHP工程师笑了，我看到各位写C的同学笑了，好吧，正所谓拉车的用马，碾磨的用驴，面对日渐庞大的网络应用环境，面对无数用JS支撑起来的交互效果，面对数以万计想用JS干掉PHP的前端同学，让我们深究一下node究竟给不给力吧。 言归正传，无论是7天学会PHP还是7天学会C++第一步都是从“Hello World”，哦，不，是从安装环境开始，我们也入乡随俗，从这儿开始。 官方安装说明（https://github.com/joyent/node/wiki/Installation） 主要内容如下 git clone https://github.com/joyent/node.git cd node export JOBS=2 # optional, sets number of parallel commands. mkdir ~/local ./configure --prefix=$HOME/local/node make make install export PATH=$HOME/local/node/bin:$PATH 根据中国特色我们需要注意： 1、确认你的系统为Linux，Mac或者Solaris，如果你试图在Windows或者Unix上安装如果你试图在Windows或者Unix(除Mac OS外)上安装，请先尝试安装编译环境，可百度，一定很多。 2、安装libssl-dev和python，通常情况下他们都有。 3、如果是Mac，需要安装Xcode。 4、你也可以通过包管理器进行安装（https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager），看到这里我吐了。。。 5、因为最近墙有问题，所以大部分时候Git都很慢，请耐心等待或者翻墙。 好，现在我们 node -v 看看是否成功了吧！ 行了，到这里我们基本上就准备完成了，可以执行国际惯例，HelloWorld了。 console.log&#40;'hello world'&#41;; 前端同学一定惊呼，我x,好熟悉啊，这不是我们经常在firebug里面用的console么？是的，node使用console来输出调试，当然如果你喜欢步进调试，喜欢逆向工程中不断的下断点来调试，你可以尝试Qleelulu这样帅气的debug，虽然我认为这样非常低效。 好了，现在可以运行也可以调试了，我和同学们都兴奋了，我要写个百度乐居（AD），我要写个新浪微博（AD），我要写个淘宝（AD），我X，我怒吼，不要慌！俗话说得好，工欲善其事，必先利其器，让我们看看nodeJS的wiki上还有什么？ nom（node package manager） npm 是基于 node 的包管理器，通过npm，我们可以很容易的安装其它基于node的扩展 [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e9%97%b2%e8%b0%88-node-%ef%bc%88%e5%88%9d%e6%8e%a2%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>构造函数(constructor)的超类</title>
		<link>http://www.zhangjingwei.com/archives/%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0constructor%e7%9a%84%e8%b6%85%e7%b1%bb/</link>
		<comments>http://www.zhangjingwei.com/archives/%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0constructor%e7%9a%84%e8%b6%85%e7%b1%bb/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 16:14:37 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1712</guid>
		<description><![CDATA[function test1&#40; name &#41;&#123; this.name = name; &#125; &#160; function test2&#40; name &#41;&#123; test1.call&#40;this,name&#41;; this.say = function&#40;&#41;&#123;&#125; &#125; &#160; test2.prototype = new test1; &#160; var t = new test2&#40;&#34;nihao&#34;&#41;; &#160; console.log&#40;t&#41;; console.log&#40;t.constructor&#41;; t的constructor说明了t的构造函数是test1，而不是test2。 这是因为t的constructor实际上是test2.prototype的constructor，而test2.prototype = new test1;因此test2test2.prototype的constructor属性就指向到了test1的prototype.constructor上test1.prototype的constructor上，也就是test1。 罗里吧嗦的，这标题起的还挺唬人的~呵呵]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0constructor%e7%9a%84%e8%b6%85%e7%b1%bb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascript File API for Mozilla</title>
		<link>http://www.zhangjingwei.com/archives/javascript-file-api-for-mozilla/</link>
		<comments>http://www.zhangjingwei.com/archives/javascript-file-api-for-mozilla/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 15:30:46 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1705</guid>
		<description><![CDATA[1. 文件读取函数 readAsBinaryString() 读取文件内容，读取结果为一个 binary string。文件每一个 byte 会被表示为一个 [0..255] 区间内的整数。函数接受一个 File 对象作为参数。 readAsText() 读取文件内容，读取结果为一串代表文件内容的文本。函数接受一个 File 对象以及文本编码名称作为参数。 readAsDataURL 读取文件内容，读取结果为一个 data: 的 URL。DataURL 由 RFC2397 定义，具体可以参考 http://www.ietf.org/rfc/rfc2397.txt。 2. 文件读取事件 Onloadstart 文件读取开始时触发。 Progress 当读取进行中时定时触发。事件参数中会含有已读取总数据量。 Abort 当读取被中止时触发。 Error 当读取出错时触发。 Load 当读取成功完成时触发。 Loadend 当读取完成时，无论成功或者失败都会触发。 &#60;form name=&#34;demoForm&#34; id=&#34;demoForm&#34; method=&#34;post&#34; enctype=&#34;multipart/form-data&#34; onsubmit=&#34;uploadAndSubmit();return false;&#34;&#62; &#60;p&#62;Upload File: &#60;input type=&#34;file&#34; name=&#34;file&#34; /&#62;&#60;/p&#62; &#60;p&#62;&#60;input type=&#34;submit&#34; value=&#34;Submit&#34; [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/javascript-file-api-for-mozilla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>函数的生成</title>
		<link>http://www.zhangjingwei.com/archives/%e5%87%bd%e6%95%b0%e7%9a%84%e7%94%9f%e6%88%90/</link>
		<comments>http://www.zhangjingwei.com/archives/%e5%87%bd%e6%95%b0%e7%9a%84%e7%94%9f%e6%88%90/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 13:58:18 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[前端开发]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1699</guid>
		<description><![CDATA[function create&#40;fun,proto&#41;&#123; var f=function&#40;&#41;&#123;&#125;; //Copy the object since it is going to be changed. for &#40;var x in proto&#41;&#123; f.prototype&#91;x&#93; = proto&#91;x&#93;; &#125; f.prototype.toString = fun; return new f; &#125; var fun=function&#40;&#41;&#123;alert&#40;&#34;a&#34;&#41;;return &#34;Hello world&#34;;&#125; var obj=&#123;x:5&#125; &#160; var foo=create&#40;fun,obj&#41;; alert&#40;foo&#41;; //Hello world foo.x=8; alert&#40;foo.x&#41;; // 8 delete foo.x; alert&#40;foo.x&#41;; // 5]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e5%87%bd%e6%95%b0%e7%9a%84%e7%94%9f%e6%88%90/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery inViewport</title>
		<link>http://www.zhangjingwei.com/archives/jquery-inviewport/</link>
		<comments>http://www.zhangjingwei.com/archives/jquery-inviewport/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 15:33:40 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[inViewport]]></category>
		<category><![CDATA[lazyload]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1690</guid>
		<description><![CDATA[晚上在微博上“拔赤”写了个lazyload插件，发现其中用到一个很有意思的方法&#8221;div.inViewportRegion()&#8221;，字面意思就是在可视区域内。 在网上找了找，发现这是YUI提供的一个组件，觉得很有意思。 http://gillserver.com/yui/api/dom-region.js.html 如果jQ里面也包含类似的方法，可以做很多事，于是GG了一下，发现国外的同学写过这种选择器，代码表现上更直观。 代码如下： &#40;function&#40;$&#41; &#123; &#160; $.belowthefold = function&#40;element, settings&#41; &#123; var fold = $&#40;window&#41;.height&#40;&#41; + $&#40;window&#41;.scrollTop&#40;&#41;; return fold &#60; = $&#40;element&#41;.offset&#40;&#41;.top - settings.threshold; &#125;; &#160; $.abovethetop = function&#40;element, settings&#41; &#123; var top = $&#40;window&#41;.scrollTop&#40;&#41;; return top &#62;= $&#40;element&#41;.offset&#40;&#41;.top + $&#40;element&#41;.height&#40;&#41; - settings.threshold; &#125;; &#160; $.rightofscreen = function&#40;element, settings&#41; &#123; var fold = [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/jquery-inviewport/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>js ip地址转真实地址</title>
		<link>http://www.zhangjingwei.com/archives/js-get-ipaddress/</link>
		<comments>http://www.zhangjingwei.com/archives/js-get-ipaddress/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 16:43:31 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1681</guid>
		<description><![CDATA[新浪，有道，ip138提供了将ip地址转换为真实地址的接口，这个控件的作用就是将这些接口封装起来，实现js将ip地址转换为真实地址。 使用方法很简单，如有html &#60;div class=&#34;query_ip&#34;&#62;202.103.22.1&#60;/div&#62; 调用如下js $&#40;&#34;.query_ip&#34;&#41;.getaddress&#40;&#123; type:&#34;youdao&#34; // 支持youdao&#124;sina&#124;ip138 (有道速度快且准确，新浪快，ip138较慢) &#125;&#41;; 则将HTML修改为 &#60;div class=&#34;query_ip&#34;&#62;202.103.22.1 湖北省十堰市 东风电信&#60;/div&#62; 具体JS源码如下 &#40;function&#40;&#41;&#123; /* * 默认配置 */ var domainAddressConf = &#123; source : &#123; &#34;sina&#34;:&#34;http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&#38;ip=&#34;, &#34;youdao&#34;:&#34;http://youliao.sinaapp.com/app/getip.php?callback=?&#38;type=youdao&#38;ip=&#34;, &#34;ip138&#34;:&#34;http://youliao.sinaapp.com/app/getip.php?callback=?&#38;ip=&#34; &#125;, type : null, charset : &#34;gb2312&#34; &#125; &#160; function getAddress&#40; self,conf &#41;&#123; var type = conf.type &#124;&#124; &#34;youdao&#34;, ipadress = conf.source&#91;type&#93; + [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/js-get-ipaddress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>无限级菜单</title>
		<link>http://www.zhangjingwei.com/archives/%e6%97%a0%e9%99%90%e7%ba%a7%e8%8f%9c%e5%8d%95/</link>
		<comments>http://www.zhangjingwei.com/archives/%e6%97%a0%e9%99%90%e7%ba%a7%e8%8f%9c%e5%8d%95/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 11:38:39 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1672</guid>
		<description><![CDATA[随手写了一个，实现不复杂，只支持动态树。 如果要用的话，获取数据哪里做下简单的修改就可以了，这只是一个Demo。 &#40;function&#40;$&#41;&#123; &#160; var jtree = &#123; treeid : &#34;jquery_tree_resource&#34;, treeclass : &#34;tree&#34;, idname : &#34;id&#34;, classname : &#34;name&#34;, optionname : &#34;options&#34;, openclass: &#34;switch_roots_open&#34;, closeclass: &#34;switch_roots_close&#34;, treeurl: &#34;&#34; &#125; &#160; // constructor function tree&#40;root, conf&#41; &#123; var self = root, cache = &#34;&#34;, // HTML缓存区 current = null, // 当前节点对象 counter = 0; // [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e6%97%a0%e9%99%90%e7%ba%a7%e8%8f%9c%e5%8d%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>运算符的特殊行为</title>
		<link>http://www.zhangjingwei.com/archives/%e8%bf%90%e7%ae%97%e7%ac%a6%e7%9a%84%e7%89%b9%e6%ae%8a%e8%a1%8c%e4%b8%ba/</link>
		<comments>http://www.zhangjingwei.com/archives/%e8%bf%90%e7%ae%97%e7%ac%a6%e7%9a%84%e7%89%b9%e6%ae%8a%e8%a1%8c%e4%b8%ba/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 07:40:34 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[运算符]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1663</guid>
		<description><![CDATA[加法运算符: 运算数是NaN、undefined，则结果为NaN Infinity加Infinity，结果为Infinity -Infinity加-Infinity，结果为-Infinity Infinity加-Infinity，结果为NaN 减法运算符： 运算数是NaN、undefined时，结果为NaN Infinity减Infinity，结果为NaN -Infinity减-Infinity，结果为NaN Infinity减-Infinity，结果为Infinity -Infinity减Infinity，结果为-Infinity 乘法运算符: 运算数是NaN，结果为NaN Infinity乘以0，结果为NaN 除法运算符: 运算数是NaN，结果为NaN Infinity除Infinity，结果为NaN 任何数除Infinity，结果为Infinity 0除非无穷大的数（Infinity），结果为是NaN 取模运算符: 运算数是NaN，结果为NaN 除数是0或者被除数是Infinity，结果为NaN Infinity除Infinity，结果为NaN 除数是Infinity，结果为被除数 被除数是0，结果为0]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e8%bf%90%e7%ae%97%e7%ac%a6%e7%9a%84%e7%89%b9%e6%ae%8a%e8%a1%8c%e4%b8%ba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>过度设计与适度设计</title>
		<link>http://www.zhangjingwei.com/archives/%e8%bf%87%e5%ba%a6%e8%ae%be%e8%ae%a1%e4%b8%8e%e9%80%82%e5%ba%a6%e8%ae%be%e8%ae%a1/</link>
		<comments>http://www.zhangjingwei.com/archives/%e8%bf%87%e5%ba%a6%e8%ae%be%e8%ae%a1%e4%b8%8e%e9%80%82%e5%ba%a6%e8%ae%be%e8%ae%a1/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 02:10:21 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[设计模式]]></category>
		<category><![CDATA[适度设计]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1661</guid>
		<description><![CDATA[我们每时每刻都在设计，无论是工作还是生活。在工作中，程序设计的深度直接影响着项目的工期和质量。 这个道理浅显易懂，每个人也都会在工作中掌握自己的设计，但每个人的都会认为自己的设计是适度的，那么如何判断一个设计究竟是适度设计还是过度设计呢？ 最近，自己做了一些项目，也遇到了这样的困惑，在大家的帮助下，稍微总结了一下过度的特点，希望能有一些价值。 1、分成与耦合程度 在做一个基于前端表现产品时，为了追求解耦，为了追求分层，将其中的功能分成不同的模块。这种思想本身是没有问题的，但过犹不及，同学们对自己的产品期望过高，甚至希望产品可以适用到绝大多数产品上，但结果往往是为了解耦而预留了过多的接口，代码臃肿不堪，不易改变，维护成本居高不下。因此，适度设计的产品应该把握，按需解耦，根据需求重构代码。 2、过多的依赖库，框架 有的时候，前端产品需要处理一些兼容性问题，因此必不可免的要写一些兼容性代码，为了方便，在有的设计中出现了过度引用第三方框架的问题。第三方框架的引入，在前期是一种解决兼容性问题行之有效的办法，但是随着时间的增长，第三方类库进行升级，bug修正。此时的第三方类库，就成为了后期维护的炸弹。同时，因为语言写法上的差异，在维护第三方类库的时候将会投入比修正兼容性问题更多的时间与精力。因此，保持代码纯净，只使用一个类库或者不使用类库，坚持代码语法规范，命名规范，格式规范是重要的。 3、为了设计而设计 有的时候，开发人员会经常接触到各种设计模式，这些设计模式，好比一座座工厂，将解决问题的方法批量的告诉我们，但工厂毕竟是工厂，他只能满足那种常见的固化需求，当需求灵活多变的时候，固化的设计模式所起到的作用就适得其反。 这只是我一些不成熟的想法，希望有这方面经验的同学多多交流。]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e8%bf%87%e5%ba%a6%e8%ae%be%e8%ae%a1%e4%b8%8e%e9%80%82%e5%ba%a6%e8%ae%be%e8%ae%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于组件中间件的前端架构</title>
		<link>http://www.zhangjingwei.com/archives/%e5%9f%ba%e4%ba%8e%e7%bb%84%e4%bb%b6%e4%b8%ad%e9%97%b4%e4%bb%b6%e7%9a%84%e5%89%8d%e7%ab%af%e6%9e%b6%e6%9e%84/</link>
		<comments>http://www.zhangjingwei.com/archives/%e5%9f%ba%e4%ba%8e%e7%bb%84%e4%bb%b6%e4%b8%ad%e9%97%b4%e4%bb%b6%e7%9a%84%e5%89%8d%e7%ab%af%e6%9e%b6%e6%9e%84/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 16:18:48 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[中间件]]></category>
		<category><![CDATA[组件中间件]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1638</guid>
		<description><![CDATA[在现在的软件设计上，基本上采用的都是分布式系统，前端尤其突出，回忆一下，我们将CSS、JS独立到不同的CDN或独立静态池上，我们将图片放到专属的图片服务器上，这都是分布式系统的体现。我们的交互界面，我们的后端程序乃至数据库都存储在各个不同的服务器上，最终，通过计算机网络将它们连接起来。 因为采用了分布式系统，前端开发中也遇到了分布式系统本身的问题，比如说分布式系统节点的广泛带来了复杂的部署环境，比如分布系统组件的协同工作会因延迟、过载、甚至失效而带来的不稳定性。 以往，我们在前端开发过程中，为了避免这些分布式系统所带来的问题，采用了各种方法，比如下图中，某网站采用将js直接写入页面中的方式避免上述问题。（当然我也可以认为这段代码是开发人员偷懒直接复制进去的， XD） view-source:http://news.sina.com.cn/c/2010-11-15/191121475156.shtml 让我们试想一下，某天下图中的接口地址变更，开发人员需要更新数万页面以保证页面工作正常，即便是拥有了各种分发机制，甚至使用重写或者301转向，也是一种维护成本高的工作方式。 为了解决分布式系统所带来的问题，各公司都引入了不同的解决方案，最典型的解决方案就是中间件。 在国内的各大主流网站中，我们不难发现类似下面的代码，从而从不同的网络节点中获取到对应的组件 上述代码是一种直接写入N个SCRIPT标签的变体，他的本质是通过getFileVesion()获取参数数组中的路径，循环建立SCRIPT/LINK对象后再插入到页面中，我们称呼这种中间件为对象计算中间件，它给我们的开发过程带来很多便利，前端工程师采用面向对象的方式编写各种组件来降低整个开发流程的复杂度，并且可以灵活有效的进行分发以提供可重用的功能。 虽然分布式对象计算中间件成熟稳定，但它也存在着一些不足，例如，当我某一个对象/组件依赖于其它对象/组件时，这两个对象需要明确对方已经载入，因此开发人员需要设计代码来实现这种对象与对象，组件与组件之间的关联，开发人员需要判断这些组件是否已经loadReady，或者组件内部需要判断他需要的对象是否已经加载。 与此同时，分布式计算中间件没有提供给我们一个标准化的方式去启用不同的组件，当我们需要停用旧的组件、增加新的组件时，修改原有组件就需要手动的去维护要增加的内容。例如，上图中，当我需要增加一个获取cookie的方法时，也许我就要增加xxxx/js/getCookie.js，甚至，我还要给他提供一个版本号来标识版本以及清除分布式系统的缓存。 那么为了解决计算中间件的上的缺陷，设计人员开发出一种称为组件中间件的技术，组件中间件通过一个组件对象来实现不同组件的调用以及管理。 组件中间件中，组件是功能实现的实体，他提供了一套方法以及连接点，以便不同的组件之间互相协助。方法可以是require也可以是add，甚至是when i needed &#8230; download，连接点就是需要载入组件的路径，在这种组件架构中，定义良好的关联关系存在于组件中间件与需要载入的对象中间，因为这种关系的存在，所以，我们可以通过组件定义、构造、加载、剔除所需要的对象，而对象也可以被要求预载入，触发事件时载入等等。 同时，组件中间件提供了对接入点的预定义，我们可以通过配置组件来达到加载不同服务节点，不同版本的对象。 虽然中间件拥有很多益处，但对于分布式系统而言，中间件也有不可靠的地方，当系统宕机时，当网络缓慢甚至断开时，中间件就无法保证所需要的对象被加载，因此在中间件的设计上也需要考虑各种可能出现的错误，并做好容错机制保证前端的页面的呈现。]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e5%9f%ba%e4%ba%8e%e7%bb%84%e4%bb%b6%e4%b8%ad%e9%97%b4%e4%bb%b6%e7%9a%84%e5%89%8d%e7%ab%af%e6%9e%b6%e6%9e%84/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>js下的多态</title>
		<link>http://www.zhangjingwei.com/archives/polymorphic/</link>
		<comments>http://www.zhangjingwei.com/archives/polymorphic/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 16:34:01 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1633</guid>
		<description><![CDATA[多态性就是多种表现形式，具体来说，可以用&#8221;一个对外接口，多个内在实现方法&#8220;表示。举一个例子，计算机中的堆栈可以存储各种格式的数据，包括整型，浮点或字符。不管存储的是何种数据，堆栈的算法实现是一样的。针对不同的数据类型，编程人员不必手工选择，只需使用统一接口名，系统可自动选择。 百科链接 我理解了下，js下应该是这样来实现 var Car = function&#40;type&#41;&#123; return new Car&#91;type&#93;&#40;&#41;; &#125; &#160; Car.jeep = function&#40;&#41;&#123;&#125; Car.jeep.prototype = &#123; showType: function&#40;&#41;&#123; return &#34;this is jeep&#34;; &#125; &#125; &#160; Car.bus = function&#40;&#41;&#123;&#125; Car.bus.prototype = &#123; showType: function&#40;&#41;&#123; return &#34;this is bus&#34;; &#125; &#125; &#160; var jeep = new Car&#40;&#34;jeep&#34;&#41;; var bus = new Car&#40;&#34;bus&#34;&#41;; &#160; jeep.showType&#40;&#41;; // [...]]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/polymorphic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>八一下八一下~</title>
		<link>http://www.zhangjingwei.com/archives/%e5%85%ab%e4%b8%80%e4%b8%8b%e5%85%ab%e4%b8%80%e4%b8%8b/</link>
		<comments>http://www.zhangjingwei.com/archives/%e5%85%ab%e4%b8%80%e4%b8%8b%e5%85%ab%e4%b8%80%e4%b8%8b/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 08:52:52 +0000</pubDate>
		<dc:creator>张经纬</dc:creator>
				<category><![CDATA[北京2010]]></category>

		<guid isPermaLink="false">http://www.zhangjingwei.com/?p=1630</guid>
		<description><![CDATA[今年十一终于回家了，阔别六年的家乡变化真大~ 姑且不说条条大道通我家，单是无数塔吊就让我心旷神怡，毕竟在集团公司里面长大的孩子对各种各种都很有爱。 老家的小吃实在便宜，一顿胡吃海喝才花了68元，68686868&#8230;.难道我是在团购么？ 离别数年的热干面，春卷，豆皮，无数有爱的食品又吃了一次，小时候吃的黄桥烧饼让我超有爱，买了25个在列车上吃&#8230; 家乡正是橘子收获的季节，神马广柑啊，神马香蕉啊，各种进口啊，统统死去，家乡的大蜜桔真的很好吃，真的很好吃，真的很好吃&#8230; 真的很有爱，就连无线网络的密码都是12345，真的很有爱！！！ 美中不足的是房价高的吓人~ 明年还要回去&#8230;买房！]]></description>
		<wfw:commentRss>http://www.zhangjingwei.com/archives/%e5%85%ab%e4%b8%80%e4%b8%8b%e5%85%ab%e4%b8%80%e4%b8%8b/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

