保存元素作为对象属性的良好实践吗?

时间:2012-12-12 20:22:42

标签: javascript backbone.js

我正在编写一个小型JavaScript框架,以实现与骨干类似的有趣和可能的实现(因此标记)。我已经开始将元素保存为对象属性,如下所示。我不确定我是否已经看到这件事,所以我很好奇这是否会导致任何问题。

同样,如果模块依赖于其他模块,我会以....另一个对象的形式列出对象顶部的那些模块。

我想要一种方法来列出依赖项(页面元素或JavaScript模块)并预先检测任何问题。这与依赖注入具有相似(不相同)的好处。

这是关于这篇code review帖子的一个具体问题,它进一步解释了该框架的工作原理。

/*MUserTry
**
**
**         
*/
$A.modelAjax({
    Name:       'MUserTry',
    S:          {
                    DynSma: SDynSma,
                    DynTwe: SDynTwe,
                    DynArc: SDynArc,
                    AniFlipPage: SAniFlipPage,
                    ClientStorage: SClientStorage
                },
    E:          {
                    but: $A('#ut_but')[0]
                },
    J:          {
                    box: $('#ut_box')
                },
    init: function () {
        var pipe = {}, 
            this_hold = this;
        this.J.box.draggable();
        this.E.but.addEventListener("click", function () {
            pipe = $A.definePipe(this_hold.Name);
            $A.ajaxMachine(pipe);
        }, false);
    },
    pre: function (pipe) {
        pipe.page.email = this.e_button.getAttribute('data-email');
        pipe.proceed = true;
    },
    post: function (pipe) {
        this.S.ClientStorage.setAll(pipe.server.smalls);
        this.S.DynSma.run(pipe.server.smalls);
        this.S.DynArc.run(pipe.server.arcmarks);
        this.S.DynTwe.run(pipe.server.tweets);
        this.S.AniFlipPage.run('ma');
    },
    finish: function (pipe) {
        $A.log(pipe);
    }
});

1 个答案:

答案 0 :(得分:2)

好吧首先让我提供强制性的“你永远不会通过重新发明轮子来获得更好的轮子”警告。无论你想要完成什么,如果使用现有的库,你几乎肯定会更成功。即使有充分的理由让你自己创造,至少看看现有的图书馆仍然会让你受益匪浅。

但是......也许你只是在玩这个项目,看看其他项目并不好玩,所以你不是这样做的。很公平。

在任何情况下,如果你看看Backbone,你会发现这种做法是Backbone View类的核心。 Backbone中的每个视图都有一个“el”和“$ el”属性,它引用视图的原始DOM元素和该元素的jQuery包装版本。

Backbone没有真正的性能问题,因为JS中的变量/属性只是指针;换句话说,当你将一个对象的属性设置为一个元素时,你不是要复制那个元素,你只是添加一个对它的引用(换句话说,它更像是你的A标签而不是而不是一整篇新文件。)

一次Backbone确实有问题(而且你的框架也会)有陈旧的引用。换句话说,如果您只是从页面中删除元素X,浏览器将停止使用内存(最终通过垃圾回收)。但是如果有一个指向该元素的对象,它将不会被垃圾收集,因为带引用的任何东西都不是“垃圾”。

因此,您必须注意的主要事项是确保这些对象:

A)在元素执行时删除,或

B)当他们的元素被删除时,摆脱他们的引用(例如delete obj.reference

如果你不这样做,事情仍然可能会正常工作......直到你在一个有很多元素被创建/删除的页面上使用它,此时Firefox将开始弹出“这个脚本占用了你跑得太久了,你真的确定要这么做吗?“消息。