首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Ext.get()与Ext.fly()之差异

2012-10-18 
Ext.get()与Ext.fly()之区别转自:渔人码头&超人&米米Ext.get()与Ext.fly()之区别 从一开始接触Ext就看到有

Ext.get()与Ext.fly()之区别
转自:渔人码头&超人&米米Ext.get()与Ext.fly()之区别


从一开始接触Ext就看到有Ext.fly这个函数,当时觉得这个跟Ext.get没什么区别,加之当时对JS性能相关
问题认识肤浅,也一直没有在意其区别,今日看learning extjs一书,看到了有专门对Ext.fly特别强调的一处:

var?flyFn?=?function(){};??2Ext.get()与Ext.fly()之差异flyFn.prototype?=?El.prototype;??3Ext.get()与Ext.fly()之差异var?_cls?=?new?flyFn();?//将Element的所有操作接口放在_cls中??4Ext.get()与Ext.fly()之差异??5Ext.get()与Ext.fly()之差异//?dom?is?optional??6Ext.get()与Ext.fly()之差异El.Flyweight?=?function(dom){??7Ext.get()与Ext.fly()之差异????this.dom?=?dom;??8Ext.get()与Ext.fly()之差异};?//仅包含一个dom属性的Object??9Ext.get()与Ext.fly()之差异?10Ext.get()与Ext.fly()之差异El.Flyweight.prototype?=?_cls;?//将操作接口复制给Element实例对象?11Ext.get()与Ext.fly()之差异El.Flyweight.prototype.isFlyweight?=?true;?//标志该Element是flyweight对象?12Ext.get()与Ext.fly()之差异?13Ext.get()与Ext.fly()之差异El._flyweights?=?{};?//flyweight对象缓存容器?14Ext.get()与Ext.fly()之差异?15Ext.get()与Ext.fly()之差异El.fly?=?function(el,?named){?16Ext.get()与Ext.fly()之差异????named?=?named?||?'_global';?17Ext.get()与Ext.fly()之差异????el?=?Ext.getDom(el);?//取得dom对象?18Ext.get()与Ext.fly()之差异????if(!el){?19Ext.get()与Ext.fly()之差异????????return?null;?20Ext.get()与Ext.fly()之差异????}?21Ext.get()与Ext.fly()之差异????if(!El._flyweights[named]){?22Ext.get()与Ext.fly()之差异????????El._flyweights[named]?=?new?El.Flyweight();?//仅在第一次调用Ext.fly时创建一个Flyweight对象并缓存?23Ext.get()与Ext.fly()之差异????}?24Ext.get()与Ext.fly()之差异????El._flyweights[named].dom?=?el;?//将flyweight对象的dom属性指向该el?25Ext.get()与Ext.fly()之差异????return?El._flyweights[named];?26Ext.get()与Ext.fly()之差异};从上面的代码不难看出,仅在第一次调用Ext.fly时创建一个Flyweight对象(该对象包含了Element的所有操作接口)并将其缓存,

之后的所有fly操作都只是修改该flyweight对象的dom属性,每次fly返回的结果都是共享的同一个flyweight对象。
这样每次fly返回的Element相比Ext.get而言,减少了每次创建Element时对大量的操作接口的创建。所有fly的对象
都共享一套Element操作接口,内存占用自然少了很多,而且执行速度也得到了提升。在大量的创建操作中效
果会更加明显。

由于fly的操作原理,我们不能将fly的返回结果保存在变量中以便重用,因为每次fly操作都将可能改变该变量的
dom指向。如下面的代码就是不正确的:

1Ext.get()与Ext.fly()之差异var?my_id?=?Ext.fly('my_id');????2Ext.get()与Ext.fly()之差异Ext.fly('another_id');?//此时my_id的dom引用已经变为another_id????3Ext.get()与Ext.fly()之差异my_id.highlight('FF0000',{?//此处的操作将是对??another_id元素的操作???????4Ext.get()与Ext.fly()之差异????endColor:'0000FF',?duration:?3????5Ext.get()与Ext.fly()之差异});

在以后使用中,一定要合理的利用Ext.get和Ext.fly,避免滥用Ext.get这个“重量级”的方法

热点排行