﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-samtiger-随笔分类-javascript 笔记</title><link>http://www.blogjava.net/samyang/category/30545.html</link><description>&lt;br&gt;
&lt;B&gt;QQ:418148757&lt;/B&gt;&lt;br&gt;
&lt;B&gt;Name:yangchuan&lt;/B&gt;&lt;br&gt;
&lt;b&gt;&lt;/b&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 31 Jul 2010 16:37:38 GMT</lastBuildDate><pubDate>Sat, 31 Jul 2010 16:37:38 GMT</pubDate><ttl>60</ttl><item><title>Ext下类函数定义</title><link>http://www.blogjava.net/samyang/archive/2010/06/29/324724.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Mon, 28 Jun 2010 23:07:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2010/06/29/324724.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/324724.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2010/06/29/324724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/324724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/324724.html</trackback:ping><description><![CDATA[<div id="blogDetailDiv" style="font-size: 16px">
<p>一：Ext下类函数定义<br />
extcore通过：Ext.extend方法来创建类（构造函数），这个类以下用sb代替。<br />
这个类函数默认会有这些属性（类属性）。<br />
superclass：父类，也就是第一个或第二个参数的prototype属性对象。（具体根据传入的参数类型决定）<br />
superclass(): 父类，(sb.propertype下) 这是一个函数，该函数返回父类的propertype对象<br />
supr():同上<br />
constructor()：构造函数，（sb函数的propertype对象下）实际上引用的就是sb函数自己。<br />
override(o)：重写方法，（sb函数下），调用的是 Ext.override(sb, o);也就是将o中的属性复制到sb的propertype下。<br />
override(o)：重写方法，（sb.propertype下）也就是将o的属性复制到sb的propertype下。<br />
extend(o):(sb函数下),该函数调用的是Ext.extend(sb.o);</p>
<p>Ext.extend(sb, sp, overrides)方法有三个参数，这三个参数有一定的类型要求：<br />
sb 一般情况下是一个类函数。<br />
sp：有两种情况：一种是类函数，另一种是：一个Object对象。<br />
overrides：Object对象，通过Ext.override(sb, overrides);方法覆盖类对象的属性。</p>
<p>通过代码分析，可以看出Ext.extend方法有两个应用：<br />
第一：<br />
因为js没有重构语法，所以我们没办法定义js方法的重构，而上边这个extend方法，可以说是一种重构的实现。因为，我们通过代码的分析，我们可以总结出extend方法的参数传</p>
<p>递方式。(用面向对象语言来表示的话，如下结构)<br />
1:extend(Calss sb,Object sp);<br />
2:extend(Calss sb,Class sp);<br />
3:extend(Calss sb,Class sp,Object overrides);<br />
第一种方式目的是定义一个类函数，这个类函数的父类为sb类函数，属性方法的定义在sp对象中完成。<br />
比如： var Student = Ext.extend(Person,{<br />
&nbsp;&nbsp; &nbsp;constructor:function(old){<br />
&nbsp;&nbsp;this.age=old;<br />
&nbsp;},<br />
&nbsp; &nbsp;name:'sam'}<br />
})<br />
其实通过<br />
&nbsp; if(Ext.isObject(sp)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overrides = sp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp = sb;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 16px; line-height: 28px; font-family: Arial">
<p style="margin: 0px 0px 3px">我们可以看出Ext.extend<br />
</p>
<p style="margin: 0px 0px 3px">只有在sp.constructor==Object.prototype.constructor的时候，才创建并返回一个函数，该函数就一句话，</p>
<p style="margin: 0px 0px 3px">就是调用sb（即父类构造函数）</p>
<p style="margin: 0px 0px 3px">如果sp.constructor==Object.prototype.constructor</p>
<p style="margin: 0px 0px 3px">那么sp应该是这样，是一个对象直接量，或者new Object方式创建的对象，且它们都没有显示定义</p>
<p style="margin: 0px 0px 3px">constructor方法。</p>
<p style="margin: 0px 0px 3px">以下这几种情况都不会有sp.constructor==Object.prototype.constructor。</p>
<p style="margin: 0px 0px 3px">1：var obj = new Object();&nbsp;</p>
<p style="margin: 0px 0px 3px">obj.constructor=function(){...};</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj) //extend 返回的类就是constructor函数</p>
<p style="margin: 0px 0px 3px">2: var obj = {</p>
<p style="margin: 0px 0px 3px">constructor:function(){...}</p>
<p style="margin: 0px 0px 3px">};</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj)&nbsp;//extend 返回的类就是constructor函数</p>
<p style="margin: 0px 0px 3px">3: var obj = new function(){...}(); &nbsp;</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj)&nbsp;//extend返回的类就是这个匿名函数</p>
<p style="margin: 0px 0px 3px">4: var obj = new function(){</p>
<p style="margin: 0px 0px 3px">this.constructor=function(){...}&nbsp;</p>
<p style="margin: 0px 0px 3px">}();</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj)&nbsp;//extend 返回的类就是constructor函数。</p>
<p style="margin: 0px 0px 3px"><br />
</p>
<p style="margin: 0px 0px 3px">总结 ：其实很简单,Ext.extend这么做的目的是要说，定义一个类，构造函数就是constructor方法，如果没显示定义这个方法，那么类就使用父类函数作为新类的构造函数。</p>
<p></span></span><br />
var A=function(){<br />
&nbsp;&nbsp; alert("this is a");<br />
}<br />
var B=function(){<br />
&nbsp;&nbsp; alert("this is b");<br />
}</p>
<p>var SubA = Ext.extend(A,new B());<br />
var subA = new SubA();//这里就会弹出 this is&nbsp; a 的提示。 <br />
第二种方式：修改现有类的类结构<br />
2:extend(Calss sb,Class sp);<br />
这个方法的目的其实之一种包装，是将sb继承于sp下，不管sb是不是ext框架下的类，在这个方法执行后sb就成了ext框架<br />
下的类结构了<br />
3:extend(Calss sb,Class sp,Object overrides);<br />
除了有第二种方法的功能外，还额外的给sb添加或覆盖新的方法或属性<br />
Ext.extend(Person,DongWu); <br />
Ext.extend(Person,DongWu，{sex:'man'}); </p>
</div>
<img src ="http://www.blogjava.net/samyang/aggbug/324724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2010-06-29 07:07 <a href="http://www.blogjava.net/samyang/archive/2010/06/29/324724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于javascript对类的一些理解</title><link>http://www.blogjava.net/samyang/archive/2008/04/01/190199.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Tue, 01 Apr 2008 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2008/04/01/190199.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/190199.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2008/04/01/190199.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/190199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/190199.html</trackback:ping><description><![CDATA[<p>1：在javascript中，函数也是一种对象，所以他也可以有属性和方法。<br />
2：定义一个类，实际上是定义一个构造函数。通常遵循的规范是函数名大写，<br />
但这个只是大家的一中习惯性的编程规范，不是必须的。当然你也可以小<br />
写。<br />
3：对象的属性有以下几种写法：<br />
　　ａ：直接在对象上添加，格式：　xxobject.xxprop = 属性值<br />
　　　xxobject表示某一个对象，xxprop表示要添加的新属性。<br />
　例：　var person = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; person.name="sam";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(person.name); //值为sam；<br />
　　上面的例子表示给person对象添加一个新的属性name并辅值为sam.<br />
　　b: 通过构造函数定义类属性．格式：<br />
&nbsp;&nbsp; function classname(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.xxprop1 = xxvalue1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.xxprop2 = xxvalue2;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; xxprop1 属性1;<br />
　例：<br />
&nbsp;&nbsp;&nbsp; function Person(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = 'sam';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.sex = '男';<br />
&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; var person = new Person();<br />
&nbsp;&nbsp; alert(person.name) //值为sam；<br />
&nbsp;&nbsp; c: 通过构造函数的prototype对象添加属性 ,格式:Class.prototype.xxprop= value;<br />
&nbsp;&nbsp;&nbsp; Class表示某构造函数，prototype是构造函数对应的prototype对象．每一个构造函数<br />
都有一个名位prototype的对象．</p>
<p>　　例：<br />
&nbsp;&nbsp;&nbsp; function Person(){　}；<br />
　　Person.prototype.name = 'sam';<br />
&nbsp;&nbsp;&nbsp; Person.prototype.sex = "男"；<br />
&nbsp;&nbsp;&nbsp; var person = new Person();<br />
&nbsp;&nbsp;&nbsp; alert(person.name) //值为sam；</p>
<p>　　注意：用构造函数体内定义的属性(如b: this.xxprop1=xxvalue1;) 与在函数的prototype<br />
对象里添加属性的方式有什么区别? <br />
&nbsp;&nbsp;&nbsp; 主要区别在于:构造函数体内定义的属性每次new一个新的对象时，都会在内存中创建这些属性<br />
的副本，而prototype里添加的属性则不会，它们在内存中始终只有一份．不会因为对象的创建，<br />
存在对分属性的内存空间．但是他们的访问方式都是一样的，都是通过对象名点属性名的方式<br />
（person.name）．<br />
&nbsp;&nbsp; d: 通过对象直接量的方式添加对象属性．格式：　var objectName={xxprop1:xxvalue,<br />
&nbsp;&nbsp;&nbsp;&nbsp; xxprop2:xxvalue2};<br />
&nbsp;&nbsp; 我们知道javascript创建一个对象，有三种方式：<br />
　　　　第一种：通过Object函数创建．如：var person = new Object();<br />
&nbsp;&nbsp;&nbsp; 然后通过上面a的方式加入属性值如: person.name = 'sam';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二种: 通过定义构造函数来创建.如上b方式.如:　person = new Person();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三种方式：通过对象直接量创建. 比如:<br />
　　　　var person = {name:'sam',sex:'man',age:18};<br />
&nbsp;&nbsp;&nbsp; 即：大括号内写入 属性 冒号 值　，即可．<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.blogjava.net/samyang/aggbug/190199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2008-04-01 21:15 <a href="http://www.blogjava.net/samyang/archive/2008/04/01/190199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>