你使用哪些JavaScript编程模式?

3
我正在重新审视我的很多代码,我一直在思考一个问题,“我应该基于哪种模式来构建所有的JS类?”
一些示例模式: http://www.klauskomenda.com/code/javascript-programming-patterns/ 我最终采用了混合方法,并添加了基本的发布/订阅功能。我不使用原型或模块模式,而是在构造函数中定义公共/私有属性和方法。
例如:
function ClassName(){
    var _privateVar = 'private';
    this.publicVar = 'public';
    function _privateMethod(){};
    this.publicMethod = function(){};
}

你在JS中通常使用哪些模式?用于什么目的?常规网站?完整的Web应用程序?是什么使您选择一种模式而不是另一种模式?或者你认为这比我想象的重要性要小吗?提前致谢。
编辑:好吧,我确实使用原型,只是不用来定义所有我的方法。但由于性能问题,我倾向于那种方法?有什么想法?

3
也许把这个问题发到 programmers.stackexchange.com 更适合。 - Benbob
1
我认为这并不像我想象的那样重要。:p - Stephen
2个回答

2

需要考虑的一些问题

使用内部函数定义公共函数比较昂贵,因为每次实例化对象时都会生成一个新的函数。在原型上定义则只使用方法的一个副本。

为了清晰起见,我总是使用下划线来表示私有方法/属性,正如你所做的那样。

我还使用模块模式来定义类中的静态私有方法。由于它们不需要访问实例,所以只会创建一次。


+1 的成本是微不足道的,尽管对于一些对象实例来说可能很小,但我无法相信它经常被忽视,私有成员/方法被高估了。 - Weston C
我不认为私有成员被高估了。然而,我认为一个好的折衷方案是使用下划线。这样,某人仍然可以侵入别人的私有成员,但知道这是不被支持的。 - Ruan Mendes

1

我们在tinyHippos使用模块模式。

这是我们关于该主题的博客文章在这里

基本上,你最终会得到:

var nameSpace = {};

// class constructor
nameSpace.SomeClass = function (arg1, arg1) {

    var _privateProperty = "foo";

    function _privateMethod() {}

    // return public methods
    return {
        publicProperty: "bar",
        publicMethod: function  publicMethod() { }
    };

};

var obj = new nameSpace.SomeClass("arg1", "arg2");

这与仅定义私有内部函数/属性和公共函数在“this”上的属性有何不同? - Ruan Mendes
@JuanMendes 在这个例子中,new 关键字是可选的。var obj = namespace.SomeClass("arg1", "arg2"); 也可以工作。 - Raynos
它“有点”起作用。两种情况都会导致obj instanceof nameSpace.SomeClass返回false。对我来说,任何对象创建模式都不应该破坏instanceof。我发表了一些关于如何使对象构建在使用或不使用new的情况下正常工作且不破坏instanceof的文章:http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接