PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/kissydoc/doc/base.html

https://github.com/jayli/jayli.github.com
HTML | 340 lines | 312 code | 24 blank | 4 comment | 0 complexity | 415ef7b82812f303a31e0bc27ed7d71b MD5 | raw file
  1. <!doctype html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>KISSY - 全终端适配的 JS 类库</title>
  6. <meta name="viewport" content="width=device-width">
  7. <link href="http://fonts.googleapis.com/css?family=Droid+Sans|Lekton|Ubuntu+Mono:400,700" rel="stylesheet">
  8. <link rel="stylesheet" href="templates/assets/bootstrap.css">
  9. <link href="templates/assets/normalize.css" rel="stylesheet">
  10. <link href="templates/assets/kissy.css" rel="stylesheet">
  11. <link href="templates/assets/prettify.css" rel="stylesheet">
  12. <link href="templates/assets/forkit.css" rel="stylesheet">
  13. <script src="templates/assets/jquery.min.js"></script>
  14. <script src="templates/assets/script.js" type="text/javascript"></script>
  15. <script src="http://g.tbcdn.cn/trip/kissy/1.4.0/seed-min.js"></script>
  16. <script src="api/assets/highlight.pack.js"></script>
  17. <link href="api/assets/tomorrow-night-bright.css" rel=stylesheet />
  18. <link rel="shortcut icon" href="http://a.tbcdn.cn/s/kissy/favicon.ico">
  19. </head>
  20. <body class="">
  21. <nav id="sidebar">
  22. <header>
  23. <a href="index.html">
  24. <!--img src="http://gtms04.alicdn.com/tps/i4/T1ceiPFbpcXXcljp_h-200-89.png"-->
  25. <!--img src="templates/assets/img/logo_6.png"-->
  26. <!--img src="http://gtms04.alicdn.com/tps/i4/T14oa2FcNcXXaOySEh-180-104.png" alt="" /-->
  27. <!--img src="http://gtms01.alicdn.com/tps/i1/T1Amq1FaXgXXbXVSUh-180-127.png" alt="" /-->
  28. <img src="http://gtms02.alicdn.com/tps/i2/T1N0jTXXXjXXay7Rri-175-78.png" alt="" />
  29. </a>
  30. </header>
  31. <ul>
  32. <li class="nav-divider"><a href="index.html"><img src="templates/assets/img/icon-home.png">首页</a></li>
  33. <li class="nav-divider"><a href="why-kissy.html"><img src="templates/assets/img/icon-why.png">Why KISSY?</a></li>
  34. <li><a href="get-started.html"><img src="templates/assets/img/icon-getting-started.png">KISSY 1.4.x 教程大纲</a></li>
  35. <li class="nav-sub"><a href="module-map.html">核心模块列表</a></li>
  36. <li class="nav-sub"><a href="kmd.html">KISSY 模块规范 (KMD)</a></li>
  37. <li class="nav-sub"><a href="gbs.html">浏览器兼容基准(GBS)</a></li>
  38. <li class="nav-sub"><a href="http://cyj.me/jquery-kissy-rosetta/">jQuery KISSY 对比手册</a></li>
  39. <li class="nav-sub"><a href="http://gallery.kissyui.com/guide">KISSY 组件开发规范</a></li>
  40. <li class="nav-sub nav-divider"><a href="history.html">历史版本</a></li>
  41. <li><a href="">API Doc</a></li>
  42. <li><a href="http://demo.kissyui.com">Demos</a></li>
  43. <li class="nav-divider"><a href="http://gallery.kissyui.com">KISSY Gallery</a></li>
  44. <li><a href="tools.html">KISSY 项目构建工具</a></li>
  45. <li class="nav-sub"><a href="kmc.html">KS Module Compiler</a></li>
  46. <li class="nav-sub"><a href="http://abc.f2e.taobao.net">ABC</a></li>
  47. <li class="nav-sub nav-divider"><a href="clam.html">Clam</a></li>
  48. <li><a href="third-party-lib.html">第三方代码库</a></li>
  49. <li class="nav-sub"><a href="https://github.com/lorrylockie/tpap/wiki">面向第三方安全的 KISSY</a></li>
  50. <li class="nav-sub"><a href="http://www.builive.com/demo/index.php">BUI</a></li>
  51. <li class="nav-sub nav-divider"><a href="http://work.tmall.net/muidoc/build/">MUI</a></li>
  52. <li><a href="https://github.com/kissyteam/kissy/blob/master/CONTRIBUTING.md"> KISSY Core 贡献代码</a></li>
  53. <li class="nav-sub"><a href="http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml">HTML/CSS编码规范</a></li>
  54. <li class="nav-sub nav-divider"><a href="http://docs.kissyui.com/source/tutorials/style-guide/google/javascriptguide.xml">JavaScript 编码规范</a></li>
  55. <li><a href="upgrade.html"><img src="templates/assets/img/icon-documentation.png">1.3.x->1.4.0 升级指南</a></li>
  56. <li><a href="faq.html"><img src="templates/assets/img/icon-faqs.png">FAQ</a></li>
  57. <li><a href="https://github.com/kissyteam/kissy"><img src="templates/assets/img/icon-github.png">GitHub</a></li>
  58. <li><a href="core-team.html"><img src="templates/assets/img/icon-google-plus.png">KISSY 核心小组</a></li>
  59. </ul>
  60. </nav>
  61. <div id="content">
  62. <article>
  63. <h1>Base</h1>
  64. <p>阅读之前先通读<a href="oo.html">KISSY 中的面向对象</a></p>
  65. <p>有了 augment我们可以很方便得扩展类的原型有了 extend我们可以很方便地继承那么 KISSY 对属性 gettersetter 的实现是基于Base完成的</p>
  66. <p>顾名思义Base 是个基础类他包含除了getter和setter之外还包含自定义事件和插件机制因此Base包括</p>
  67. <ol>
  68. <li><code>getter</code><code>setter</code>方法实现Attribute</li>
  69. <li>自定义事件机制CustomEvent</li>
  70. <li>代码插拔机制Plugin</li>
  71. </ol>
  72. <p><img src="http://gtms04.alicdn.com/tps/i4/T1a55UFbtaXXbsDJoj-389-190.png" alt=""></p>
  73. <p>这三类功能被封装在<code>base</code>模块中这样来载入base</p>
  74. <pre><code>KISSY.use(&#39;base&#39;,function(S,Base){
  75. // Your Code...
  76. });</code></pre>
  77. <blockquote>
  78. <p>在KISSY 1.3.x 中有一个别名RichBase1.4.0 及以后版本将统一为Base在实现上Base 使用了自定义事件掺元对象<code>CustomEvent.Target</code>和内置的掺元对象<code>Attribute</code></p>
  79. </blockquote>
  80. <p>我们来分别看下Base的这几个特性</p>
  81. <h2>1属性管理Attribute</h2>
  82. <p>Base 的属性配置来自 Attribute 模块它提供如下方法</p>
  83. <ul>
  84. <li>addAttr()</li>
  85. <li>addAttrs()</li>
  86. <li>hasAttr()</li>
  87. <li>get()</li>
  88. <li>getAttrVals()</li>
  89. <li>set()</li>
  90. <li>reset()</li>
  91. </ul>
  92. <p>通过 get() set() 这一层包装Base 允许类在定义自己时配置 gettersetter 方法用法如下</p>
  93. <pre><code>// 生成一个类Dog
  94. var Dog = Base.extend({
  95. initializer:function(){
  96. var self = this;
  97. // Your Code
  98. alert(&#39;ok&#39;);
  99. }
  100. },{
  101. ATTRS: {
  102. name:{
  103. value:&#39;abc&#39;
  104. }
  105. }
  106. });</code></pre>
  107. <p>这时Dog的实例具有Attr特性</p>
  108. <pre><code>var dog1 = new Dog(); //new Dog的时候自动调用initializer方法
  109. dog1.set(&#39;name&#39;,&#39;dommy&#39;);// 设置这只小狗的名字
  110. alert(dog1.get(&#39;name&#39;));</code></pre>
  111. <p>Attr的好处是可以检查存入值的合法性同时可以触发&#39;值改变&#39;的自定义事件方便对值的状态进行监听</p>
  112. <p>上段代码提到初始化一个实例的时候会自动调用一个初始化函数来构造实例通常是在定义这个类的时候就设定构造函数</p>
  113. <pre><code>var Dog = Base.extend({
  114. initializer:function(){
  115. // 构造函数
  116. },
  117. destructor: function() {
  118. // 析构函数
  119. }
  120. },{/*ATTRS*/});</code></pre>
  121. <p>其中析构函数是实例对象在调用<code>.destroy()</code>时触发的</p>
  122. <p>可以用关联矩阵(associative array)的方式定义类的属性和配置参数,</p>
  123. <pre><code>var Dog = Base.extend({
  124. _onSetName:function(){
  125. // name 属性发生改变时的回调
  126. }
  127. },{
  128. ATTRS: {
  129. name: {
  130. value:&#39;value&#39;,
  131. valueFn:function(){
  132. },
  133. setter:function(){
  134. // 这里可以对值进行校验
  135. },
  136. getter: function(s) {
  137. }
  138. }
  139. }
  140. });</code></pre>
  141. <p>实例化Dog类并设置attr属性值</p>
  142. <pre><code>var dog = new Dog({name:1});
  143. dog.set(&#39;name&#39;,2);</code></pre>
  144. <p>Base提供了对属性值初始化的同步以及变化的事件监听上面的实例化和设置属性值都会同步调用到类中定义的<code>_onSet{驼峰写法的属性名}</code>函数但这里的<code>_onSetAttr</code>看上去是个内部方法我们可以使用绑定事件的形式来监听值的变化事件有</p>
  145. <ul>
  146. <li>beforeAttrNameChange</li>
  147. <li>afterAttrNameChange</li>
  148. <li>*Change</li>
  149. </ul>
  150. <p>注意此处的 AttrName 是个示例名称例如 breed 的相应事件名称是</p>
  151. <ul>
  152. <li>beforeBreedChange</li>
  153. <li>afterBreedChange</li>
  154. </ul>
  155. <pre><code>dog.on(&#39;afterBreedChange&#39;, function(e) {
  156. console.log(&#39;我要从&#39; + e.prevVal + &#39;变成&#39; + e.newVal + &#39;&#39;)
  157. })</code></pre>
  158. <p>如何让一个已有的类获得Attr特性</p>
  159. <pre><code>// Dog 是一个已有的类
  160. Base.extend(Dog, Base, {
  161. bark: function() {
  162. this.fire(&#39;bark&#39;, {
  163. message: &#39;Woof! I just barked!&#39;
  164. })
  165. }
  166. })
  167. // 这时Dog类就具有了Base特性
  168. var dog = new Dog();
  169. dog.on(&#39;bark&#39;, function(e) {
  170. console.log(e.message) // ==&gt; &#39;Woof! I just barked!&#39;
  171. });</code></pre>
  172. <p>如果Dog没有被定义过我想直接定义一个类这样做是上一段代码的另一种写法</p>
  173. <pre><code>// 直接定义一个类 Dog
  174. var Dog = Base.extend({
  175. initializer:function(){
  176. var self = this;
  177. },
  178. bark:function(){
  179. this.fire(&#39;bark&#39;, {
  180. message: &#39;Woof! I just barked!&#39;
  181. });
  182. }
  183. },{/*ATTRS*/});
  184. var dog = new Dog();</code></pre>
  185. <h2>2自定义事件 CustomEvent</h2>
  186. <p>继承自Base的对象可以分发自定义事件即实例上有<code>fire()</code>方法比如上一段代码bark() 函数中触发了一个自定义事件<code>bark</code>绑定这个事件即可收到这个事件具体用法可参照<a href="event.html">Event自定义事件部分</a></p>
  187. <h2>3插件机制Plugin</h2>
  188. <p>ATTR 的作用是给类本身新增特性完成类与类之间的代码共享对于要给实例动态增加新特性就需要新的机制插件机制Base提供了一个配置plugins和三个函数plugunplug和getPlugin用来管理插件在正式讲解之前读者一定要明白插件的本质是&quot;代码注入&quot;即安装和卸载的行为分别执行一段外部脚本</p>
  189. <p>插件实际上是一个简单对象在类实例化的时候可以实例化plugin也可以在实例化后插入plugin当载入插件时调用 plugin pluginInitializer 初始化函数在销毁插件的时候调用 pluginDestructor 析构函数用法是调用实例的<code>plug(plugin)</code>方法</p>
  190. <p>参数plugin可以是类也可以是实例如果是类则无参实例化plugin 两者都会调用plugin的pluginInitializer初始化函数推荐以实例的形式写插件</p>
  191. <p>一个插件对象</p>
  192. <pre><code>var PluginA = {
  193. pluginInitializer:function(){},
  194. pluginDestructor:function(){}
  195. };</code></pre>
  196. <p>直接传实例化的示例代码</p>
  197. <pre><code>new Editor().plug({
  198. pluginInitializer:function(){},
  199. pluginDestructor:function(){}
  200. })</code></pre>
  201. <p>与之对应的方法是<code>unplug(plugin)</code>从plugins数组中移除plugin并调用pluginDestructor析构函数</p>
  202. <p>第三个方法<code>getPlugin(id)</code>是通过类plugin定义的的<code>p.get(&#39;pluginIn&#39;) || p.pluginId</code>来拿到plugin的实例</p>
  203. <p>实现一个简单的plugin</p>
  204. <pre><code>// 实现一个简单的插件
  205. var PluginA = {
  206. pluginInitializer:function(){
  207. alert(&#39;插件运行&#39;);
  208. // 插入插件时调用
  209. },
  210. pluginDestructor:function(){
  211. // 拔出插件时调用
  212. }
  213. };
  214. var Dog = Base.extend({
  215. initializer:function(){
  216. // Dog构造函数
  217. }
  218. },{});
  219. // 实例化一个Dog
  220. var dog = new Dog();
  221. dog.plug(PluginA);// 弹出&#39;插件运行&#39;</code></pre>
  222. <p>也可以直接在初始化的时候传入plugin.</p>
  223. <pre><code>var dog = new Dog({
  224. plugins:[PluginA]
  225. }); </code></pre>
  226. <p>卸载插件的方法</p>
  227. <pre><code>dog.unplug(PluginA);</code></pre>
  228. <p>如果定义插件时指定了插件id可以通过插件id来卸载插件</p>
  229. <pre><code>var PluginA = {
  230. // 定义插件id
  231. pluginId:&#39;myname&#39;,
  232. pluginInitializer:function(){
  233. alert(&#39;插件运行&#39;);
  234. // 插入插件时调用
  235. },
  236. pluginDestructor:function(){
  237. // 拔出插件时调用
  238. }
  239. };
  240. dog.plug(PluginA);// 装载插件
  241. dog.unplug(&#39;myname&#39;);// 通过插件id来卸载插件</code></pre>
  242. <p>插件是一种注入代码的方法利用好插件特性可以让你的代码架构更加清晰比如editor就大量使用了插件机制</p>
  243. <div id="disqus_thread"></div>
  244. <script>
  245. if((window.location.hostname.indexOf("kissyui.com")!=-1 )&& window.localStorage.getItem("kissy-commment")!="0"){
  246. /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
  247. var disqus_shortname = 'kissy-docs'; // required: replace example with your forum shortname
  248. // The following are highly recommended additional parameters. Remove the slashes in front to use.
  249. //var disqus_identifier = '/anim';
  250. //var disqus_url = window.location;
  251. /* * * DON'T EDIT BELOW THIS LINE * * */
  252. (function() {
  253. var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
  254. dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
  255. (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  256. })();
  257. }
  258. </script>
  259. <style>
  260. .github-btn {
  261. border: 0 none;
  262. overflow: hidden;
  263. margin-top:4px;
  264. }
  265. footer {
  266. border-top:1px solid #e2e2e2;
  267. padding-top:20px;
  268. clear:both;
  269. }
  270. /* iPhone 及以下 */
  271. @media only screen and (max-width: 767px) {
  272. .github-link {
  273. display:none;
  274. }
  275. }
  276. </style>
  277. <footer>
  278. <div class="text-center">
  279. ©2013 - 2033 KISSY UI LIBRARY
  280. <br /> <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=watch&amp;count=true" width="100" height="20" title="Star on GitHub"></iframe>
  281. <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=fork&amp;count=true" width="102" height="20" title="Fork on GitHub"></iframe>
  282. </div>
  283. </footer>
  284. </article>
  285. </div>
  286. <a target="_blank" href="https://github.com/kissyteam/kissy" class="github-link"><img alt="Fork me on GitHub" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" style="position: absolute; top: 0; right: 0; border: 0; z-index: 50"></a>
  287. <script>
  288. var S = KISSY;
  289. (function(){
  290. S.use('node',function(S){
  291. S.all('code').each(function(node){
  292. var className = node.attr('class');
  293. if(/^lang-/.test(className)){
  294. var tc = className.replace(/^lang-/,'');
  295. node.replaceClass(className,tc);
  296. }
  297. });
  298. hljs.tabReplace = ' ';
  299. hljs.initHighlighting();
  300. });
  301. })();
  302. (function(){
  303. var h3s = document.getElementsByTagName('h3');
  304. for(var i = 0;i<h3s.length;i++){
  305. var str = S.trim(h3s[i].innerHTML);
  306. try{
  307. str = str.match(/\w+/)[0];
  308. }catch(e){
  309. continue;
  310. }
  311. h3s[i].innerHTML = '<a name="'+str+'"></a>' + h3s[i].innerHTML;
  312. }
  313. })();
  314. </script>
  315. </body>
  316. </html>