2011-12-14 152 views
3

最近我和一些同事讨论了一些我发现不正确的东西。 我们使用了大量的应用骨干网和我的方式来创建视图是 “标准”骨干路:将函数传递给Backbone.View.extend

var MyView = Backbone.View.extend({ 
    className: 'foo', 
    initialize: function() { 
    _.bindAll(this, 'render' /* ... more stuff */); 
    }, 
    render: function() { 
    /* ... render, usually 
     using _.template and passing 
     in this.model.toJSON()... */ 
    return this; 
    } 
}); 

但有人在团队最近决定做这样说:

var MyView = Backbone.View.extend((function() { 
    /* 'private stuff' */ 
    function bindMethods(view) { 
    _.bindAll(view, /* ... more stuff */); 
    }; 
    function render(view) { 
    /* ... render, usually 
     using _.template and passing 
     in view.model.toJSON()... */ 
    }; 
    return { 
    className: 'foo', 
    initialize: function() { 
     bindMethods(this); 
     render(this); 
    } 
    }; 
}()); 

这就是伪代码的想法。 读了BB源和阅读教程,文章我觉得这是一个 不好的做法(对我来说是没有意义的),但我从 其他骨干开发者/用户喜欢一些反馈提前

谢谢

+0

就我个人而言,我不认为需要像这样封闭视图,这会降低可读性。 – c4urself 2011-12-14 09:06:44

+0

非常同意。这是不可读的......但比我认为这可能导致混乱。感谢您的反馈 – 2011-12-14 09:09:25

回答

2

我从使用闭包中看到的一个好处是为变量和函数提供私有空间,您不希望从视图外的代码访问变量和函数。

即使如此,我还没有看到许多骨干的应用程序使用闭包定义视图/模型/收集等

这里的杰里米阿什克纳斯关于这个问题,以及电子邮件。

是的,使用闭包创建具有私有变量的对象的实例在JavaScript中是可能的。但这是一个不好的做法,应该避免。这与Backbone无关;这是JavaScript中OOP的本质。

如果您使用封闭模式(也称为“模块”模式),则为每个创建的实例创建每个函数的新副本。这完全忽略了原型,而且在速度方面,特别是在内存使用方面都非常低效。如果您制作10,000个模型,您还将拥有10,000个每个成员函数的副本。通过原型(使用Backbone.Model.extend),即使有10,000个实例,每个成员函数也只有一个副本。

0

我完全同意保罗在这里。有时你可能会发现有必要定义私有的方法和属性,而且不能从外部混淆。我认为这取决于你是否需要这个范围机制。混合两种方法,就你对班级的要求而言,不会那么糟糕,是吗?