Ext.get()与Ext.fly()之区别
转自:渔人码头&超人&米米Ext.get()与Ext.fly()之区别
从一开始接触Ext就看到有Ext.fly这个函数,当时觉得这个跟Ext.get没什么区别,加之当时对JS性能相关
问题认识肤浅,也一直没有在意其区别,今日看learning extjs一书,看到了有专门对Ext.fly特别强调的一处:
var?flyFn?=?function(){};??2flyFn.prototype?=?El.prototype;??3var?_cls?=?new?flyFn();?//将Element的所有操作接口放在_cls中??4??5//?dom?is?optional??6El.Flyweight?=?function(dom){??7????this.dom?=?dom;??8};?//仅包含一个dom属性的Object??9?10El.Flyweight.prototype?=?_cls;?//将操作接口复制给Element实例对象?11El.Flyweight.prototype.isFlyweight?=?true;?//标志该Element是flyweight对象?12?13El._flyweights?=?{};?//flyweight对象缓存容器?14?15El.fly?=?function(el,?named){?16????named?=?named?||?'_global';?17????el?=?Ext.getDom(el);?//取得dom对象?18????if(!el){?19????????return?null;?20????}?21????if(!El._flyweights[named]){?22????????El._flyweights[named]?=?new?El.Flyweight();?//仅在第一次调用Ext.fly时创建一个Flyweight对象并缓存?23????}?24????El._flyweights[named].dom?=?el;?//将flyweight对象的dom属性指向该el?25????return?El._flyweights[named];?26};从上面的代码不难看出,仅在第一次调用Ext.fly时创建一个Flyweight对象(该对象包含了Element的所有操作接口)并将其缓存,
之后的所有fly操作都只是修改该flyweight对象的dom属性,每次fly返回的结果都是共享的同一个flyweight对象。
这样每次fly返回的Element相比Ext.get而言,减少了每次创建Element时对大量的操作接口的创建。所有fly的对象
都共享一套Element操作接口,内存占用自然少了很多,而且执行速度也得到了提升。在大量的创建操作中效
果会更加明显。
由于fly的操作原理,我们不能将fly的返回结果保存在变量中以便重用,因为每次fly操作都将可能改变该变量的
dom指向。如下面的代码就是不正确的:
1var?my_id?=?Ext.fly('my_id');????2Ext.fly('another_id');?//此时my_id的dom引用已经变为another_id????3my_id.highlight('FF0000',{?//此处的操作将是对??another_id元素的操作???????4????endColor:'0000FF',?duration:?3????5});
在以后使用中,一定要合理的利用Ext.get和Ext.fly,避免滥用Ext.get这个“重量级”的方法