<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_寻梦E.net</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/86055/rss</id><updated>2012-02-07T01:18:29Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/86055/rss"/><entry><id>http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340843.html</id><title type="text">Javascript面向对象编程（三）：非构造函数的继承</title><summary type="text">今天是最后一个部分，介绍不使用构造函数实现&amp;quot;继承&amp;quot;。一、什么是&amp;quot;非构造函数&amp;quot;的继承？比如，现在有一个对象，叫做&amp;quot;中国人&amp;quot;。 var Chinese = { nation:&amp;#39;中国&amp;#39; };还有一个对象，叫做&amp;quot;医生&amp;quot;。 var Doctor ={ career:&amp;#39;医生&amp;#39; }请问怎样才能让&amp;quot;医生&amp;quot;去继承&amp;quot;中国人&amp;quot;，也就是说，我怎样才能生成一个&amp;quot;中国医生&amp;quot;的对象？这里要注意，这两个对象都是普通对象，不是构造函数，无法使用构造函数方法实</summary><published>2012-02-07T00:58:00Z</published><updated>2012-02-07T00:58:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340843.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340843.html"/><content type="html">&lt;p&gt;今天是最后一个部分，介绍不使用构造函数实现"继承"。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一、什么是"非构造函数"的继承？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;比如，现在有一个对象，叫做"中国人"。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Chinese = {&lt;br /&gt;　　　　nation:'中国'&lt;br /&gt;　　};&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;还有一个对象，叫做"医生"。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Doctor ={&lt;br /&gt;　　　　career:'医生'&lt;br /&gt;　　}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;请问怎样才能让"医生"去继承"中国人"，也就是说，我怎样才能生成一个"中国医生"的对象？&lt;/p&gt;&#xD;
&lt;p&gt;这里要注意，这两个对象都是普通对象，不是构造函数，无法使用构造函数方法实现"继承"。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、object()方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;json格式的发明人Douglas Crockford，提出了一个object()函数，可以做到这一点。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function object(o) {&lt;/p&gt;&#xD;
&lt;p&gt;function F() {}&lt;/p&gt;&#xD;
&lt;p&gt;F.prototype = o;&lt;/p&gt;&#xD;
&lt;p&gt;return new F();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这个object()函数，其实只做一件事，就是把子对象的prototype属性，指向父对象，从而使得子对象与父对象连在一起。&lt;/p&gt;&#xD;
&lt;p&gt;使用的时候，第一步先在父对象的基础上，生成子对象：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Doctor = object(Chinese);&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;然后，再加上子对象本身的属性：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Doctor.career = '医生';&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这时，子对象已经继承了父对象的属性了。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(Doctor.nation); //中国&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;三、浅拷贝&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;除了使用"prototype链"以外，还有另一种思路：把父对象的属性，全部拷贝给子对象，也能实现继承。&lt;/p&gt;&#xD;
&lt;p&gt;下面这个函数，就是在做拷贝：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function extendCopy(p) {&lt;/p&gt;&#xD;
&lt;p&gt;var c = {};&lt;/p&gt;&#xD;
&lt;p&gt;for (var i in p) {&amp;nbsp;&lt;br /&gt;　　　　　　c[i] = p[i];&lt;br /&gt;　　　　}&lt;/p&gt;&#xD;
&lt;p&gt;c.uber = p;&lt;/p&gt;&#xD;
&lt;p&gt;return c;&lt;br /&gt;　　}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;使用的时候，这样写：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Doctor = extendCopy(Chinese);&lt;/p&gt;&#xD;
&lt;p&gt;Doctor.career = '医生';&lt;/p&gt;&#xD;
&lt;p&gt;alert(Doctor.nation); // 中国&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;但是，这样的拷贝有一个问题。那就是，如果父对象的属性等于数组或另一个对象，那么实际上，子对象获得的只是一个内存地址，而不是真正拷贝，因此存在父对象被篡改的可能。&lt;/p&gt;&#xD;
&lt;p&gt;请看，现在给Chinese添加一个"出生地"属性，它的值是一个数组。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Chinese.birthPlaces = ['北京','上海','香港'];&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;通过extendCopy()函数，Doctor继承了Chinese。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Doctor = extendCopy(Chinese);&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;然后，我们为Doctor的"出生地"添加一个城市：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Doctor.birthPlaces.push('厦门');&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;发生了什么事？Chinese的"出生地"也被改掉了！&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门&lt;/p&gt;&#xD;
&lt;p&gt;alert(Chinese.birthPlaces); //北京, 上海, 香港, 厦门&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;所以，extendCopy()只是拷贝基本类型的数据，我们把这种拷贝叫做"浅拷贝"。这是早期jQuery实现继承的方式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;四、深拷贝&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所谓"深拷贝"，就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难，只要递归调用"浅拷贝"就行了。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function deepCopy(p, c) {&lt;/p&gt;&#xD;
&lt;p&gt;var c = c || {};&lt;/p&gt;&#xD;
&lt;p&gt;for (var i in p) {&lt;/p&gt;&#xD;
&lt;p&gt;if (typeof p[i] === 'object') {&lt;/p&gt;&#xD;
&lt;p&gt;c[i] = (p[i].constructor === Array) ? [] : {};&lt;/p&gt;&#xD;
&lt;p&gt;deepCopy(p[i], c[i]);&lt;/p&gt;&#xD;
&lt;p&gt;} else {&lt;/p&gt;&#xD;
&lt;p&gt;c[i] = p[i];&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;br /&gt;　　　　}&lt;/p&gt;&#xD;
&lt;p&gt;return c;&lt;br /&gt;　　}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;使用的时候这样写：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Doctor = deepCopy(Chinese);&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;现在，给父对象加一个属性，值为数组。然后，在子对象上修改这个属性：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Chinese.birthPlaces = ['北京','上海','香港'];&lt;/p&gt;&#xD;
&lt;p&gt;Doctor.birthPlaces.push('厦门');&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这时，父对象就不会受到影响了。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门&lt;/p&gt;&#xD;
&lt;p&gt;alert(Chinese.birthPlaces); //北京, 上海, 香港&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;目前，jQuery库使用的就是这种继承方法。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2340843.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340843.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340831.html</id><title type="text">Javascript面向对象编程（二）：构造函数的继承</title><summary type="text">今天要介绍的是，如何生成一个&amp;quot;继承&amp;quot;多个对象的实例。比如，现在有一个&amp;quot;动物&amp;quot;对象的构造函数， function Animal(){ this.species = &amp;quot;动物&amp;quot;; }还有一个&amp;quot;猫&amp;quot;对象的构造函数， function Cat(name,color){ this.name = name; this.color = color; }怎样才能使&amp;quot;猫&amp;quot;继承&amp;quot;动物&amp;quot;呢？1. 构造函数绑定最简单的方法，大概就是使用call或apply方法，将父对象的构造函数绑定在子对象上，也就是</summary><published>2012-02-07T00:45:00Z</published><updated>2012-02-07T00:45:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340831.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340831.html"/><content type="html">&lt;p&gt;今天要介绍的是，如何生成一个"继承"多个对象的实例。&lt;/p&gt;&#xD;
&lt;p&gt;比如，现在有一个"动物"对象的构造函数，&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　function Animal(){&lt;/p&gt;&#xD;
&lt;p&gt;this.species = "动物";&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;还有一个"猫"对象的构造函数，&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　function Cat(name,color){&lt;/p&gt;&#xD;
&lt;p&gt;this.name = name;&lt;/p&gt;&#xD;
&lt;p&gt;this.color = color;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;怎样才能使"猫"继承"动物"呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. 构造函数绑定&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最简单的方法，大概就是使用call或apply方法，将父对象的构造函数绑定在子对象上，也就是在子对象构造函数中加一行：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Cat(name,color){&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Animal.apply(this, arguments);&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;this.name = name;&lt;/p&gt;&#xD;
&lt;p&gt;this.color = color;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.species); // 动物&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. prototype模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;更常见的做法，则是使用prototype属性。&lt;/p&gt;&#xD;
&lt;p&gt;如果"猫"的prototype对象，指向一个Animal的实例，那么所有"猫"的实例，就能继承Animal了。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Cat.prototype = new Animal();&lt;/p&gt;&#xD;
&lt;p&gt;Cat.prototype.constructor = Cat;&lt;/p&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.species); // 动物&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;代码的第一行，我们将Cat的prototype对象指向一个Animal的实例。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Cat.prototype = new Animal();&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;它相当于完全删除了prototype 对象原先的值，然后赋予一个新值。但是，第二行又是什么意思呢？&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Cat.prototype.constructor = Cat;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;原来，任何一个prototype对象都有一个constructor属性，指向它的构造函数。也就是说，Cat.prototype 这个对象的constructor属性，是指向Cat的。&lt;/p&gt;&#xD;
&lt;p&gt;我们在前一步已经删除了这个prototype对象原来的值，所以新的prototype对象没有constructor属性，所以我们必须手动加上去，否则后面的"继承链"会出问题。这就是第二行的意思。&lt;/p&gt;&#xD;
&lt;p&gt;总之，这是很重要的一点，编程时务必要遵守。下文都遵循这一点，即如果替换了prototype对象，&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;o.prototype = {};&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;那么，下一步必然是为新的prototype对象加上constructor属性，并将这个属性指回原来的构造函数。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;o.prototype.constructor = o;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. 直接继承prototype&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于Animal对象中，不变的属性都可以直接写入Animal.prototype。所以，我们也可以让Cat()跳过 Animal()，直接继承Animal.prototype。&lt;/p&gt;&#xD;
&lt;p&gt;现在，我们先将Animal对象改写：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Animal(){ }&lt;/p&gt;&#xD;
&lt;p&gt;Animal.prototype.species = "动物";&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;然后，将Cat的prototype对象，然后指向Animal的prototype对象，这样就完成了继承。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Cat.prototype = Animal.prototype;&lt;/p&gt;&#xD;
&lt;p&gt;Cat.prototype.constructor = Cat;&lt;/p&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.species); // 动物&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;与前一种方法相比，这样做的优点是效率比较高（不用执行和建立Animal的实例了），比较省内存。缺点是 Cat.prototype和Animal.prototype现在指向了同一个对象，那么任何对Cat.prototype的修改，都会反映到Animal.prototype。&lt;/p&gt;&#xD;
&lt;p&gt;所以，上面这一段代码其实是有问题的。请看第二行&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Cat.prototype.constructor = Cat;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这一句实际上把Animal.prototype对象的constructor属性也改掉了！&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(Animal.prototype.constructor); // Cat&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4. 利用空对象作为中介&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于"直接继承prototype"存在上述的缺点，所以可以利用一个空对象作为中介。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var F = function(){};&lt;/p&gt;&#xD;
&lt;p&gt;F.prototype = Animal.prototype;&lt;/p&gt;&#xD;
&lt;p&gt;Cat.prototype = new F();&lt;/p&gt;&#xD;
&lt;p&gt;Cat.prototype.constructor = Cat;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;F是空对象，所以几乎不占内存。这时，修改Cat的prototype对象，就不会影响到Animal的prototype对象。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(Animal.prototype.constructor); // Animal&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5. prototype模式的封装函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们将上面的方法，封装成一个函数，便于使用。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function extend(Child, Parent) {&lt;br /&gt;&lt;br /&gt;　　　　var F = function(){};&lt;/p&gt;&#xD;
&lt;p&gt;F.prototype = Parent.prototype;&lt;/p&gt;&#xD;
&lt;p&gt;Child.prototype = new F();&lt;/p&gt;&#xD;
&lt;p&gt;Child.prototype.constructor = Child;&lt;/p&gt;&#xD;
&lt;p&gt;Child.uber = Parent.prototype;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;使用的时候，方法如下&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;extend(Cat,Animal);&lt;/p&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.species); // 动物&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这个extend函数，就是YUI库如何实现继承的方法。&lt;/p&gt;&#xD;
&lt;p&gt;另外，说明一点。函数体最后一行&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Child.uber = Parent.prototype;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;意思是为子对象设一个uber属性，这个属性直接指向父对象的prototype属性。这等于是在子对象上打开一条通道，可以直接调用父对象的方法。这一行放在这里，只是为了实现继承的完备性，纯属备用性质。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6. 拷贝继承&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面是采用prototype对象，实现继承。我们也可以换一种思路，纯粹采用"拷贝"方法实现继承。简单说，如果把父对象的所有属性和方法，拷贝进子对象，不也能够实现继承吗？&lt;/p&gt;&#xD;
&lt;p&gt;首先，还是把Animal的所有不变属性，都放到它的prototype对象上。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Animal(){}&lt;/p&gt;&#xD;
&lt;p&gt;Animal.prototype.species = "动物";&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;然后，再写一个函数，实现属性拷贝的目的。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function extend2(Child, Parent) {&lt;/p&gt;&#xD;
&lt;p&gt;var p = Parent.prototype;&lt;/p&gt;&#xD;
&lt;p&gt;var c = Child.prototype;&lt;/p&gt;&#xD;
&lt;p&gt;for (var i in p) {&lt;/p&gt;&#xD;
&lt;p&gt;c[i] = p[i];&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;c.uber = p;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这个函数的作用，就是将父对象的prototype对象中的属性，一一拷贝给Child对象的prototype对象。&lt;/p&gt;&#xD;
&lt;p&gt;使用的时候，这样写：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;extend2(Cat, Animal);&lt;/p&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.species); // 动物&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2340831.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340831.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340819.html</id><title type="text">javascript 面向对象编程（一）：封装</title><summary type="text">Javascript 面向对象编程（一）：封装作者：阮一峰Javascript是一种基于对象（object-based）的语言，你遇到的所有东西几乎都是对象。但是，它又不是一种真正的面向对象编程（OOP）语言，因为它的语法中没有class（类）。那么，如果我们要把&amp;quot;属性&amp;quot;（property）和&amp;quot;方法&amp;quot;（method），封装成一个对象，甚至要从原型对象生成一个实例对象，我们应该怎么做呢？1. 生成对象的原始模式假定我们把猫看成一个对象，它有&amp;quot;名字&amp;quot;和&amp;quot;颜色&amp;quot;两个属性。 var Cat = { name : &amp;#39;</summary><published>2012-02-07T00:36:00Z</published><updated>2012-02-07T00:36:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340819.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340819.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Javascript 面向对象编程（一）：封装&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;作者：阮一峰&lt;/p&gt;&#xD;
&lt;p&gt;Javascript是一种基于对象（object-based）的语言，你遇到的所有东西几乎都是对象。但是，它又不是一种真正的面向对象编程（OOP）语言，因为它的语法中没有class（类）。&lt;/p&gt;&#xD;
&lt;p&gt;那么，如果我们要把"属性"（property）和"方法"（method），封装成一个对象，甚至要从原型对象生成一个实例对象，我们应该怎么做呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. 生成对象的原始模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;假定我们把猫看成一个对象，它有"名字"和"颜色"两个属性。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var Cat = {&lt;/p&gt;&#xD;
&lt;p&gt;name : '',&lt;/p&gt;&#xD;
&lt;p&gt;color : ''&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;现在，我们需要根据这个原型对象，生成两个实例对象。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var cat1 = {}; // 创建一个空对象&lt;/p&gt;&#xD;
&lt;p&gt;cat1.name = "大毛"; // 按照原型对象的属性赋值&lt;/p&gt;&#xD;
&lt;p&gt;cat1.color = "黄色";&lt;/p&gt;&#xD;
&lt;p&gt;var cat2 = {};&lt;/p&gt;&#xD;
&lt;p&gt;cat2.name = "二毛";&lt;/p&gt;&#xD;
&lt;p&gt;cat2.color = "黑色";&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;好了，这就是最简单的封装了。但是，这样的写法有两个缺点，一是如果多生成几个实例，写起来就非常麻烦；二是实例与原型之间，没有任何办法，可以看出有什么联系。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. 原始模式的改进&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们可以写一个函数，解决代码重复的问题。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Cat(name,color){&lt;/p&gt;&#xD;
&lt;p&gt;return {&lt;/p&gt;&#xD;
&lt;p&gt;name:name,&lt;/p&gt;&#xD;
&lt;p&gt;color:color&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;然后生成实例对象，就等于是在调用函数：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var cat1 = Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;var cat2 = Cat("二毛","黑色");&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这种方法的问题依然是，cat1和cat2之间没有内在的联系，不能反映出它们是同一个原型对象的实例。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. 构造函数模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了解决从原型对象生成实例的问题，Javascript提供了一个构造函数（Constructor）模式。&lt;/p&gt;&#xD;
&lt;p&gt;所谓"构造函数"，其实就是一个普通函数，但是内部使用了&lt;a href="http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html" target="_blank"&gt;this变量&lt;/a&gt;。对构造函数使用new运算符，就能生成实例，并且this变量会绑定在实例对象上。&lt;/p&gt;&#xD;
&lt;p&gt;比如，猫的原型对象现在可以这样写，&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Cat(name,color){&lt;/p&gt;&#xD;
&lt;p&gt;this.name=name;&lt;/p&gt;&#xD;
&lt;p&gt;this.color=color;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;我们现在就可以生成实例对象了。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;var cat2 = new Cat("二毛","黑色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.name); // 大毛&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.color); // 黄色&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这时cat1和cat2会自动含有一个constructor属性，指向它们的构造函数。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(cat1.constructor == Cat); //true&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat2.constructor == Cat); //true&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;Javascript还提供了一个instanceof运算符，验证原型对象与实例对象之间的关系。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(cat1 instanceof Cat); //true&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat2 instanceof Cat); //true&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4. 构造函数模式的问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;构造函数方法很好用，但是存在一个浪费内存的问题。&lt;/p&gt;&#xD;
&lt;p&gt;请看，我们现在为Cat对象添加一个不变的属性"type"（种类），再添加一个方法eat（吃老鼠）。那么，原型对象Cat就变成了下面这样：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Cat(name,color){&lt;/p&gt;&#xD;
&lt;p&gt;this.name = name;&lt;/p&gt;&#xD;
&lt;p&gt;this.color = color;&lt;/p&gt;&#xD;
&lt;p&gt;this.type = "猫科动物";&lt;/p&gt;&#xD;
&lt;p&gt;this.eat = function(){alert("吃老鼠");};&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;还是采用同样的方法，生成实例：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;var cat2 = new Cat ("二毛","黑色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.type); // 猫科动物&lt;/p&gt;&#xD;
&lt;p&gt;cat1.eat(); // 吃老鼠&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;表面上好像没什么问题，但是实际上这样做，有一个很大的弊端。那就是对于每一个实例对象，type属性和eat()方法都是一模一样的内容，每一次生成一个实例，都必须为重复的内容，多占用一些内存。这样既不环保，也缺乏效率。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(cat1.eat == cat2.eat); //false&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;能不能让type属性和eat()方法在内存中只生成一次，然后所有实例都指向那个内存地址呢？回答是可以的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5. Prototype模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Javascript规定，每一个构造函数都有一个prototype属性，指向另一个对象。这个对象的所有属性和方法，都会被构造函数的实例继承。&lt;/p&gt;&#xD;
&lt;p&gt;这意味着，我们可以把那些不变的属性和方法，直接定义在prototype对象上。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;function Cat(name,color){&lt;/p&gt;&#xD;
&lt;p&gt;this.name = name;&lt;/p&gt;&#xD;
&lt;p&gt;this.color = color;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;Cat.prototype.type = "猫科动物";&lt;/p&gt;&#xD;
&lt;p&gt;Cat.prototype.eat = function(){alert("吃老鼠")};&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;然后，生成实例。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;var cat1 = new Cat("大毛","黄色");&lt;/p&gt;&#xD;
&lt;p&gt;var cat2 = new Cat("二毛","黑色");&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.type); // 猫科动物&lt;/p&gt;&#xD;
&lt;p&gt;cat1.eat(); // 吃老鼠&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这时所有实例的type属性和eat()方法，其实都是同一个内存地址，指向prototype对象，因此就提高了运行效率。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(cat1.eat == cat2.eat); //true&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6. Prototype模式的验证方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6.1 isPrototypeOf()&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个方法用来判断，某个proptotype对象和某个实例之间的关系。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(Cat.prototype.isPrototypeOf(cat1)); //true&lt;/p&gt;&#xD;
&lt;p&gt;alert(Cat.prototype.isPrototypeOf(cat2)); //true&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6.2 hasOwnProperty()&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;每个实例对象都有一个hasOwnProperty()方法，用来判断某一个属性到底是本地属性，还是继承自prototype对象的属性。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert(cat1.hasOwnProperty("name")); // true&lt;/p&gt;&#xD;
&lt;p&gt;alert(cat1.hasOwnProperty("type")); // false&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6.3 in运算符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;in运算符可以用来判断，某个实例是否含有某个属性，不管是不是本地属性。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;alert("name" in cat1); // true&lt;/p&gt;&#xD;
&lt;p&gt;alert("type" in cat1); // true&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;in运算符还可以用来遍历某个对象的所有属性。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); }&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2340819.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2012/02/07/2340819.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/12/07/2279573.html</id><title type="text">js 模拟队列类</title><summary type="text">/* * 模拟队列 */var Qu ={};//构造函数Qu.Queue = function (len) { this.capacity = len; //队列最大容量 this.list = new Array(); //队列数据};//入队Qu.Queue.prototype.enqueue = function (data) { if (data == null) return; if(this.list.length&amp;gt;=this.capacity) { this.list.remove(0); } this...</summary><published>2011-12-07T08:58:00Z</published><updated>2011-12-07T08:58:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/12/07/2279573.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/12/07/2279573.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; * 模拟队列&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Qu ={};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;构造函数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;Qu.Queue = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (len) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.capacity = len;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;队列最大容量&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Array();    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;队列数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;入队&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;Qu.Queue.prototype.enqueue = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (data) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (data == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list.length&amp;gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.capacity)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list.remove(0);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list.push(data);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;出队&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;Qu.Queue.prototype.dequeue = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list.remove(0);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;队列长度&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;Qu.Queue.prototype.size = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list.length;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;队列是否空&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;Qu.Queue.prototype.isEmpty = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;|&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list==&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.list.length&amp;gt;0;&lt;br /&gt;};&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;//对象数组扩展remove&#xD;
Array.prototype.remove = function(dx) {&#xD;
    if (isNaN(dx) || dx &amp;gt; this.length) {&#xD;
        return false;&#xD;
    }&#xD;
    for (var i = 0, n = 0; i &amp;lt; this.length; i++) {&#xD;
        if (this[i] != this[dx]) {&#xD;
            this[n++] = this[i]&#xD;
        }&#xD;
    }&#xD;
    this.length -= 1&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;调用例子：&lt;/p&gt;&#xD;
&lt;p&gt;//队列初始化&lt;/p&gt;&#xD;
&lt;p&gt;var queue = new Qu.Queue(10);&lt;/p&gt;&#xD;
&lt;p&gt;queue.enqueue(1);&lt;/p&gt;&#xD;
&lt;p&gt;queue.enqueue(2);&lt;/p&gt;&#xD;
&lt;p&gt;queue.enqueue(3);&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2279573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/12/07/2279573.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/12/05/2276637.html</id><title type="text">Visual Studio 2010 所有版本 中文 英文 下载,激活,序列号,注册码,下载地址</title><summary type="text">Visual Studio 2010 下载,安装,激活,序列号,注册码,下载地址(全集) 附Visual Studio 2008下载地址 激活 sp1下载Visual Studio 2010 激活码 Visual Studio 2010注册码YCFHQ-9DWCY-DKV88-T2TMH-G7BHP破解方式：Product Key为YCFHQ9DWCYDKV88T2TMHG7BHP，用这个key替换安装盘中setup目录中的setup.sdb中[Product Key]的内容，重新保存即可，这是针对Visual Studio 2010 Ultimate版，其他版本的应该也适用，之后的安装就一路</summary><published>2011-12-05T04:18:00Z</published><updated>2011-12-05T04:18:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/12/05/2276637.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/12/05/2276637.html"/><content type="html">&lt;div id="appShareTitle"&gt;Visual Studio 2010 下载,安装,激活,序列号,注册码,下载地址(全集) 附Visual Studio 2008下载地址 激活 sp1下载&lt;/div&gt;&#xD;
&lt;div id="app-share-content"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;Visual Studio 2010 激活码 Visual Studio 2010注册码&lt;br /&gt;YCFHQ-9DWCY-DKV88-T2TMH-G7BHP&amp;nbsp;&lt;br /&gt;破解方式：Product Key为YCFHQ9DWCYDKV88T2TMHG7BHP，用这个key替换安装盘中setup目录中的setup.sdb中[Product Key]的内容，重新保存即可，这是针对Visual Studio 2010 Ultimate版，其他版本的应该也适用，之后的安装就一路顺风了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a&gt;&lt;span&gt;custom fabric&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、Microsoft Visual Studio 2010 Ultimate的安装与下载&lt;/p&gt;&#xD;
&lt;p&gt;标题：Microsoft Visual Studio 2010 Ultimate &amp;ndash; ISO&lt;/p&gt;&#xD;
&lt;p&gt;文件名：X16-42552VS2010UltimTrial1.iso 容量：2283.0 MB SHA-1: 0&amp;times;8371f6a8d090063fcc320617e94854374633df3c&lt;/p&gt;&#xD;
&lt;p&gt;网页地址：&lt;a&gt;&lt;span&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=06a32b1c-80e9-41df-ba0c-79d56cb823f7&amp;amp;displaylang=en&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载地址：&lt;a&gt;&lt;span&gt;http://download.microsoft.com/download/2/4/7/24733615-AA11-42E9-8883-E28CDCA88ED5/X16-42552VS2010UltimTrial1.iso&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2、Microsoft Visual Studio 2010 Ultimate的注册与破解&lt;/p&gt;&#xD;
&lt;p&gt;Help-&amp;gt;Register Product-&amp;gt; 注册码 YCFHQ-9DWCY-DKV88-T2TMH-G7BHP&lt;/p&gt;&#xD;
&lt;p&gt;Visual Studio 2010 下载地址 Visual Studio 2010 下载 Visual Studio 2010 中文下载&lt;/p&gt;&#xD;
&lt;p&gt;专业版(Professional)&lt;br /&gt;&lt;a&gt;&lt;span&gt;http://download.microsoft.com/download/4/0/E/40EFE5F6-C7A5-48F7-8402-F3497FABF888/X16-42555VS2010ProTrial1.iso&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;高级版(Premium)&lt;br /&gt;&lt;a&gt;&lt;span&gt;http://download.microsoft.com/download/F/F/8/FF8C8AF1-D520-4027-A844-8EC7BC0FB27C/X16-42546VS2010PremTrial1.iso&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;旗舰版(Ultimate)&lt;br /&gt;&lt;a&gt;&lt;span&gt;http://download.microsoft.com/download/2/4/7/24733615-AA11-42E9-8883-E28CDCA88ED5/X16-42552VS2010UltimTrial1.iso&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;测试专业版(Test Professional)&lt;br /&gt;LicenseKey注册码=6F0510EB-FF8F-47ec-96E1-78FB4B955330&lt;/p&gt;&#xD;
&lt;p&gt;Visual Studio 2010 Professional 官方试用版内置序列号：&lt;br /&gt;[Product Key]序列号&lt;br /&gt;Q49M2-C79JF-QP93Q-WX9GJ-6TKKD&lt;br /&gt;Visual Studio 2010 Professional 正式序列号：（已安装测试可用。Professional版与Ultimate版均测试通过！）&lt;br /&gt;YCFHQ-9DWCY-DKV88-T2TMH-G7BHP&lt;/p&gt;&#xD;
&lt;p&gt;Visual Studio 2010 Ultimate 官方试用版内置序列号：&lt;br /&gt;[Product Key]序列号&lt;br /&gt;YR3W8-FCM2B-7BKF9-HMQFT-CH7WK&lt;/p&gt;&#xD;
&lt;p&gt;下载了官方试用版的同学，安装后可以通过添加删除程序对Visual Studio 2010进行序列号更换。&lt;br /&gt;或者修改安装光盘中setup目录下的setup.sdb文件，做一次安装激活。&lt;/p&gt;&#xD;
&lt;p&gt;MSDN官网上公布的Visual Studio 2010 SHA1及CRC：&lt;br /&gt;File Name: en_visual_studio_2010_ultimate_x86_dvd_509116.iso&lt;br /&gt;Date Published (UTC): 4/12/2010 8:53:48 AM&lt;br /&gt;Last Updated (UTC): 4/12/2010 10:44:43 AM&lt;br /&gt;SHA1: 84C90BB02AF92347010FF9058E0A2BA28F19CC53&lt;br /&gt;ISO/CRC: B22E6250&lt;/p&gt;&#xD;
&lt;p&gt;File Name: en_visual_studio_2010_premium_x86_dvd_509357.iso&lt;br /&gt;Date Published (UTC): 4/12/2010 8:53:23 AM&lt;br /&gt;Last Updated (UTC): 4/12/2010 10:44:31 AM&lt;br /&gt;SHA1: A4E69966496AD0F704FE9D97FAC2A723EF75A99B&lt;br /&gt;ISO/CRC: D314471B&lt;/p&gt;&#xD;
&lt;p&gt;File Name: en_visual_studio_2010_professional_x86_dvd_509727.iso&lt;br /&gt;Date Published (UTC): 4/12/2010 8:53:35 AM&lt;br /&gt;Last Updated (UTC): 4/12/2010 10:44:19 AM&lt;br /&gt;SHA1: F0ED50712D83BF0EDA7D284DA76DF49E4C88CEF7&lt;br /&gt;ISO/CRC: 6D4DCAE4&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;h2 &gt;vs2010 中文版下载地址及可用CDKEY&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;VS2010中文旗舰版下载地址（用迅雷下载即可，不需要安装电驴）：&lt;a title="vs2010中文版下载地址"&gt;&lt;span&gt;ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;序列号：YCFHQ-9DWCY-DKV88-T2TMH-G7BHP&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Visual Studio 2008&lt;/p&gt;&#xD;
&lt;p&gt;1、Visual Studio 2008 Team Suite Edition的安装与下载&lt;/p&gt;&#xD;
&lt;p&gt;标题：Visual Studio Team System 2008 Team Suite (90-day Trial)&lt;/p&gt;&#xD;
&lt;p&gt;文件名：VS2008TeamSuiteENU90DayTrialX1429235.iso&amp;nbsp; 容量：3921.2 MB&lt;/p&gt;&#xD;
&lt;p&gt;网页地址：&lt;a&gt;&lt;span&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d95598d7-aa6e-4f24-82e3-81570c5384cb&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载地址：&lt;a&gt;&lt;span&gt;http://download.microsoft.com/download/d/8/9/d89c9839-ac45-4a6c-b25f-2f60b190e356/VS2008TeamSuiteENU90DayTrialX1429235.iso&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2、Visual Studio 2008 Team Suite Edition的注册与破解&lt;/p&gt;&#xD;
&lt;p&gt;方法1：安装完90天试用版后，在&amp;ldquo;添加或删除应用程序&amp;rdquo;，删除vs 2008，点击&amp;ldquo;卸载&amp;rdquo;，在卸载里有让输入序列号的地方，把正式版的序列号PYHYP-WXB3B-B2CCM-V9DX9-VDY8T输入进去就行了。&lt;/p&gt;&#xD;
&lt;p&gt;方法2：把iso文件中的setup文件夹中的setup.sdb文件中的[Product Key]下的一行的原来的序列号换为能用的正式版的序列号就行了。&lt;br /&gt;[Product Key]序列号&lt;br /&gt;PYHYPWXB3BB2CCMV9DX9VDY8T&lt;br /&gt;3、Microsoft Visual Studio 2008 Service Pack 1安装与下载&lt;/p&gt;&#xD;
&lt;p&gt;标题：Microsoft Visual Studio 2008 Service Pack 1 (iso)&lt;/p&gt;&#xD;
&lt;p&gt;文件名：VS2008SP1ENUX1512962.iso 容量：831.3 MB&lt;/p&gt;&#xD;
&lt;p&gt;网页地址：&lt;a&gt;&lt;span&gt;http://www.microsoft.com/downloads/details.aspx?familyid=27673C47-B3B5-4C67-BD99-84E525B5CE61&amp;amp;displaylang=en&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载地址：&lt;a&gt;&lt;span&gt;http://download.microsoft.com/download/a/3/7/a371b6d1-fc5e-44f7-914c-cb452b4043a9/VS2008SP1ENUX1512962.iso&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2276637.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/12/05/2276637.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/08/04/2127722.html</id><title type="text">Jquery 操作checkbox</title><summary type="text">1,获取radio选中项的值var rate = $(&amp;quot;input[name=rdtype]:checked&amp;quot;).val();2,判断checkbox是否被选中var chkBind = $(&amp;quot;#chkBind&amp;quot;).attr(&amp;#39;checked&amp;#39;);3,checkbox全选，取消$(&amp;quot;#chkSelectAll&amp;quot;).click(function() { var flag = $(this).attr(&amp;quot;checked&amp;quot;); $(&amp;quot;[name=chkItem]:checkbox&amp;quot;).</summary><published>2011-08-04T09:19:00Z</published><updated>2011-08-04T09:19:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/08/04/2127722.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/08/04/2127722.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,获取radio选中项的值&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; rate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;input[name=rdtype]:checked&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,判断checkbox是否被选中&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; chkBind &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;#chkBind&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).attr(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;checked&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;,checkbox全选，取消&lt;br /&gt;$(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;#chkSelectAll&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() {&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; flag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;).attr(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;checked&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;[name=chkItem]:checkbox&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).each(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() {&lt;br /&gt;    $(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;).attr(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;checked&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, flag);&lt;br /&gt;  })&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2127722.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/08/04/2127722.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/08/02/2124804.html</id><title type="text">jQuery动态添加的元素绑定事件处理函数</title><summary type="text">有一段时间没用jquery了，今天又碰到这个问题。当时是知道有livejquery可以解决。但是我并不喜欢为了这个而另外加载一个。我当时的处理方法是在添加的时候手工绑定事件处理函数。不过新版的jquery已经添加了这个功能。我们已经不需要为此烦恼了。参考：http://api.jquery.com/live/以前我们定义事件，比如为元素定义单击事件是这样写的：$(&amp;#39;input&amp;#39;).click(function () {//处理代码});或$(&amp;#39;.clickme&amp;#39;).bind(&amp;#39;click&amp;#39;, function() { // Bound handl</summary><published>2011-08-02T03:14:00Z</published><updated>2011-08-02T03:14:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/08/02/2124804.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/08/02/2124804.html"/><content type="html">&lt;p&gt;有一段时间没用jquery了，今天又碰到这个问题。当时是知道有livejquery可以解决。但是我并不喜欢为了这个而另外加载一个。我当时的处理方法是在添加的时候手工绑定事件处理函数。不过新版的jquery已经添加了这个功能。我们已经不需要为此烦恼了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;参考：&lt;a href="http://api.jquery.com/live/" style="color: #336699; text-decoration: none;"&gt;http://api.jquery.com/live/&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;以前我们定义事件，比如为元素定义单击事件是这样写的：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;$('input').click(function () {&lt;/p&gt;&#xD;
&lt;p&gt;//处理代码&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;或&lt;/p&gt;&#xD;
&lt;p&gt;$('.clickme').bind('click', function() {&lt;br /&gt;&amp;nbsp; // Bound handler called.&lt;br /&gt;});&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;但是这只能是对已经加载好的元素定义事件，那些后来添加插入的元素则需要另行绑定。即使你使用jquery的clone函数，它并不能将事件也复制（到目前为止我还不清楚它是为什么这样定义，是没法复制还是刻意这么处理，以防止出现某些异常，这还有待去分析一下jquery的源代码）。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;现在，使用live你可以轻松搞定，&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;$('.clickme').live('click', function() { // Live handler called. });&lt;/pre&gt;&#xD;
&lt;pre&gt;这样，你即使在后面动态插入的元素，也会被绑定事件，&lt;/pre&gt;&#xD;
&lt;pre&gt;$('body').append('&amp;lt;div &amp;gt;Another target&amp;lt;/div&amp;gt;');&lt;/pre&gt;&#xD;
&lt;pre&gt;转自：&lt;span  style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;"&gt;&lt;a href="http://blog.csdn.net/xinhaozheng/article/details/5862109"&gt;http://blog.csdn.net/xinhaozheng/article/details/5862109&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2124804.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/08/02/2124804.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/07/31/2122596.html</id><title type="text">博客园的用户体验其实很差！</title><summary type="text">目前发布博客的主要流程：当用户进入http://www.cnblogs.com/后，要点击右上角的“我的博客”进入个人博客页，然后要点击左边菜单的“管理”（非常不起眼的地方）进入后台，然后还要选择“新随笔”，写完后，后面还有一大堆选项。整个过程，即使用不写博客也要差不多30秒。说实话，我从来没有看到比这个流程更复杂的博客了！不知大家有没有同感。有时明明想发表点什么。但是看到流程如此复杂。又不想发表了！很喜欢博客园，每天上班必打开的网站。所以希望博客园有更好的体验。尤其是作为一个技术性网站。用户体验的如此不好真有点说不过去！dudu加油！博客园加油！</summary><published>2011-07-31T02:54:00Z</published><updated>2011-07-31T02:54:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/07/31/2122596.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/07/31/2122596.html"/><content type="html">&lt;p&gt;目前发布博客的主要流程：当用户进入&lt;a href="http://www.cnblogs.com/"&gt;http://www.cnblogs.com/&lt;/a&gt;后，要点击右上角的&amp;ldquo;我的博客&amp;rdquo;进入个人博客页，然后要点击左边菜单的&amp;ldquo;管理&amp;rdquo;（非常不起眼的地方）进入后台，然后还要选择&amp;ldquo;新随笔&amp;rdquo;，写完后，后面还有一大堆选项。整个过程，即使用不写博客也要差不多30秒。说实话，我从来没有看到比这个流程更复杂的博客了！&lt;/p&gt;&#xD;
&lt;p&gt;不知大家有没有同感。有时明明想发表点什么。但是看到流程如此复杂。又不想发表了！很喜欢博客园，每天上班必打开的网站。所以希望博客园有更好的体验。尤其是作为一个技术性网站。用户体验的如此不好真有点说不过去！dudu加油！博客园加油！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2122596.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/07/31/2122596.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/05/13/2045751.html</id><title type="text">Asp.net Mvc2 Ajax JsonResult的用使用</title><summary type="text">在Asp.net Mvc 2中由于对数据的保护，默认情况下request为post，所以在前端请求的时候则需要以post方式requestaction方法：public JsonResult GetPersonInfo() { var person = new { Name = &amp;quot;张三&amp;quot;, Age = 22, Sex = &amp;quot;男&amp;quot; }; return Json(person); }前端请求代码：$.ajax({ url: &amp;quot;/FriendLink/GetPersonInfo&amp;quot;, type: &amp;quot;POST&amp;quot;, dataT</summary><published>2011-05-13T09:51:00Z</published><updated>2011-05-13T09:51:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/05/13/2045751.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/05/13/2045751.html"/><content type="html">&lt;p&gt;在Asp.net Mvc 2中由于对数据的保护，默认情况下request为post，所以在前端请求的时候则需要以post方式request&lt;/p&gt;&#xD;
&lt;p&gt;action方法：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; JsonResult GetPersonInfo() &lt;br /&gt;        { &lt;br /&gt;            var person &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;br /&gt;            { &lt;br /&gt;                Name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;张三&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;                Age &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;22&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;                Sex &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;男&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt; &lt;br /&gt;            }; &lt;br /&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; Json(person); &lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;前端请求代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span&gt;$.ajax({                &lt;br /&gt;           url: &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;/FriendLink/GetPersonInfo&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;           type: &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;,&lt;br /&gt;           dataType: &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;           data: { },&lt;br /&gt;           success: &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(data) {       &lt;br /&gt;                 $(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;#friendContent&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;).html(data.Name); &lt;br /&gt;           }&lt;br /&gt;         })&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;但是，如果是换成了GET方式request则会出错，如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/Raycloud/258373/r_11.jpg" alt="Get方式" width="640" height="327" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;难道这样一来不能用GET方式request了吗？&lt;/p&gt;&#xD;
&lt;p&gt;当然肯定是可以的，很简单&lt;/p&gt;&#xD;
&lt;p&gt;json方法有一个重构：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;internal&lt;/span&gt;&lt;span&gt; JsonResult Json(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; data);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;internal&lt;/span&gt;&lt;span&gt; JsonResult Json(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; data, JsonRequestBehavior behavior);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;我们只需要使用第二种就行了，加上一个 json请求行为为Get方式就OK了&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span&gt; public JsonResult GetPersonInfo() &lt;br /&gt;        { &lt;br /&gt;            &lt;/span&gt;&lt;span&gt;var&lt;/span&gt;&lt;span&gt; person &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;br /&gt;            { &lt;br /&gt;                Name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;张三&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;                Age &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;22&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;                Sex &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;男&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt; &lt;br /&gt;            }; &lt;br /&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; Json(person,JsonRequestBehavior.AllowGet); &lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样一来我们在前端就可以使用Get方式请求了：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span&gt;$.getJSON(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;/FriendLink/GetPersonInfo&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(data) { &lt;br /&gt;                $(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;#friendContent&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;).html(data.Name);&lt;br /&gt;            })&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样我们就可以通过Json序列化我们要返回的对象（返回JsonResult），我们就不用再使用JavaScriptSerializer来进行序列化了，MVC已经帮我们处理好了这些，是不是更加容易了现在！&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;转自：&lt;a href="http://blog.csdn.net/dongxiaohui2008/archive/2010/12/22/6092776.aspx"&gt;http://blog.csdn.net/dongxiaohui2008/archive/2010/12/22/6092776.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2045751.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/05/13/2045751.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lsmsky/archive/2011/05/09/2041415.html</id><title type="text">Chrome Form多次提交表单的问题</title><summary type="text">Chrome Form多次提交表单的问题今天用chrome提交一个表单时，发现一个奇怪的问题： //提交表单 document.frmOrder.action = &amp;#39;http://www.abc.com/d.aspx&amp;#39;; document.frmOrder.method = &amp;#39;POST&amp;#39;; document.frmOrder.target = &amp;#39;_blank&amp;#39;; document.frmOrder.submit();第一次提交可以，第二次提交就没有任何响应了。需要重新加载页面后才可以提交，而这个问题在Firefox,IE下没有出现。马上Googl</summary><published>2011-05-09T10:09:00Z</published><updated>2011-05-09T10:09:00Z</updated><author><name>E猫</name><uri>http://www.cnblogs.com/lsmsky/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lsmsky/archive/2011/05/09/2041415.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lsmsky/archive/2011/05/09/2041415.html"/><content type="html">&lt;h1 &gt;Chrome Form多次提交表单的问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;今天用chrome提交一个表单时，发现一个奇怪的问题：&lt;/div&gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;提交表单&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    document.frmOrder.action &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://www.abc.com/d.aspx&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    document.frmOrder.method &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;POST&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    document.frmOrder.target &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;_blank&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    document.frmOrder.submit();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;第一次提交可以，第二次提交就没有任何响应了。需要重新加载页面后才可以提交，而这个问题在Firefox,IE下没有出现。&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;马上Google了一下发现这是webkit内核浏览器的共有特性，这样做是为了防止表单被重复提交。&lt;/p&gt;&#xD;
&lt;p&gt;解决方法也很简单，只需要为 submit 按钮添加 onclick 事件响应，给表单的 action 值添加一个无用的参数，改变表单的响应地址。&lt;/p&gt;&#xD;
&lt;p&gt;具体实现方法:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;//提交表单&#xD;
    document.frmOrder.action = 'http://www.abc.com/d.aspx?r='+Math.random();&#xD;
    document.frmOrder.method = 'POST';&#xD;
    document.frmOrder.target = '_blank';&#xD;
    document.frmOrder.submit();&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/lsmsky/aggbug/2041415.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lsmsky/archive/2011/05/09/2041415.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
