Javascript原型实用程序方法与参考性能

Javascript原型实用程序方法与参考性能,javascript,performance,optimization,prototypejs,Javascript,Performance,Optimization,Prototypejs,嗨,伙计们,我有个问题 我正在努力寻找性能方面最有效的方法来存储和访问javascript原型库中的元素 假设我在测试类中动态创建了一个具有子元素的父元素 testclass = Class.create({ newParent: null, //I will create a global reference to the parent element method1: function(){ this.newParent = new Element('div',{

嗨,伙计们,我有个问题

我正在努力寻找性能方面最有效的方法来存储和访问javascript原型库中的元素

假设我在测试类中动态创建了一个具有子元素的父元素

testclass = Class.create({

   newParent: null, //I will create a global reference to the parent element

   method1: function(){
      this.newParent = new Element('div',{'id':'newParent'});
      var elm = new Element('div',
      {
         'id': 'elm1',
         'identifier': 'elm1identifier'
      }
      );

      newParent.insert(elm);
   },

    method2: function(){
       ??????????
    }

})
在方法2中,我希望能够访问元素elm1

我一直在思考,以下是我的不同解决方案

  • 我可以使用prototype$()提供的实用方法访问元素

  • 我可以对元素进行全局引用

    elm1: null,
    ....
    method2: function(){
      this.elm1
    }
    
  • 3.我可以将方法中的元素作为参数传递,但此选项并不总是可用

  • 我创建一个唯一标识符作为属性,并使用prototype.down函数

    this.newParent.down('[identifier=elm1identifier]');
    
  • 当然,我使用了这些方法的组合,但我很好奇,在所有方法中,哪一种在性能方面是最有效的

    我听说$()实用程序方法搜索整个dom?这是一个显著的区别吗?如果你有很多元素呢

    存储对元素的引用也可能导致内存问题,特别是在大型网站中有大量javascript的情况下

    使用唯一的自定义标识符也很好,但是您还可以添加新的属性,这可能会对dom本身产生影响。但这一优势在于,您可以在prototype中使用element.down()方法指定要搜索的位置


    谢谢大家的帮助。

    如果您正在创建一个应该表示DOM元素的对象,那么给它一个引用元素的属性,比如“元素”,似乎是明智的。然后在方法1中:

    我认为在这个阶段,性能的微观优化是毫无意义的,因为性能的最大改进是不使用Prototype.js

    $()方法首先是document.getElementById的别名(在浏览器中速度非常快,一直如此),其次是向返回的元素添加方便的方法。如果浏览器没有实现基于原型的继承方案,Prototpye.js将大约50个方法作为属性直接添加到元素中,这是一个非常昂贵的操作

    我怀疑存储对元素的引用会导致严重的内存问题,除非您存储了成千上万个元素而没有使用它们(它们毕竟只是引用)

    使用唯一的自定义标识符 也不错,但你也添加了新的 可能产生影响的属性 关于dom本身


    不要向DOM元素添加自定义属性或属性。Prototype.js 2.0版终于脱离了这个模型,只是不要这样做。如果您有一个表示(或“包装”)元素的对象,请将属性添加到该对象。

    因此,如果必须在引用和使用$()之间进行选择,哪一个更有效?您说过性能的最大改进是不使用prototype.js?这是否意味着使用本机javascript而不是框架将显著提高性能?谢谢你的回答。一般来说,引用会更快,但可能不会太快。$()的问题在于,它的行为不适用于未实现DOM元素原型继承的浏览器。POJ可以带来显著的性能优势,但同样,除非进行大量处理,否则您可能不会注意到。
    this.newParent.down('[identifier=elm1identifier]');
    
    this.element = elm;