用于编写javascript对象的最干净的格式

时间:2009-08-26 19:00:45

标签: javascript

编写javascript对象的最简洁格式是什么?

目前我用以下格式写我的

if (Namespace1 == null) var Namespace1 = {};
if (Namespace1.NameSpace2 == null) Namespace1.NameSpace2 = {};

Namespace1.NameSpace2.Class1 = function(param1,param2){
     // define private instance variables and their getters and setters
     var privateParam = param1;
     this.getPrivateParam = function() {return privateParam;}
     this.publicParam1 = param2;
}

Namespace1.Namespace2.Class1.prototype = {
     publicParam1:null,
     publicFunction1:function() {/* Function body*/}
}

这种格式现在运行良好,因为YUI文档软件能够解析它,评论和回馈良好的文档。但它没有提供的是在命名空间中声明静态全局方法的简洁方法。我也想知道是否有更简洁的方法来声明私有变量。

我的问题是,是否有人使用更清晰的方式定义javascript对象,如果是这样,为什么你的方法更好?

谢谢!

4 个答案:

答案 0 :(得分:5)

首先,如果您不知道是否定义了Namespace1,请使用typeof this.Namespace1 !== "undefined",因为访问Namespace1会在未定义时抛出错误。此外,未定义的属性为undefined,而不是null(尽管undefined == null)。如果实际上某些内容 null ,您的检查将失败。如果您不想使用typeof检查属性是否未定义,请使用myObject.property === undefined

此外,您的第二个示例语法无效。以下是我认为你想做的事情:

Namespace1.Namespace2.Class1.prototype = {
     publicParam1    : null,
     publicFunction1 : function () {/* Function body*/}
};

答案 1 :(得分:5)

模块模式可以帮到你:

 var Namespace1 = Namespace1 || {};
    Namespace1.Namespace2 = Namespace1.Namespace2 || {};

    Namespace1.Namespace2.Class1 = function(param1, param2) {
        // define private instance variables and their getters and setters
        var privateParam = param1;
        this.getPrivateParam = function() { return privateParam; }
        this.publicParam1 = param2;

        return {
            init: function() {
                alert('hi from Class1');
            }
        }
    } ();

您可以在此处详细了解:http://yuiblog.com/blog/2007/06/12/module-pattern/

    Namespace1.Namespace2.Class1.init();

答案 2 :(得分:1)

当然要重写前两行:

var Namespace1 = Namespace1 || {};
Namespace1.Namespace2 = Namespace1.Namespace2 || {};

剩下的看起来还可以。私有变量几乎就是每个人都这样做的。正如您所做的那样,静态方法应该分配给prototype

请注意重新定义对象的整个原型,因为它会阻止您使用基于prototype的继承的常见模式。例如:

// You inherit like this...
Sub.prototype = new Super();
obj = new Sub();

// Then you overwrite Sub.prototype when you do this:
Sub.prototype = {foo:1, bar:2}

// Instead, you should assign properties to the prototype individually:
Sub.prototype.foo = 1;
Sub.prototype.bar = 2;

答案 3 :(得分:1)

我使用以下功能:

jQuery.namespace = function() {
    var a = arguments, o = null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d = a[i].split(".");
        o = window;
        for (j=0; j<d.length; j=j+1) {
            o[d[j]] = o[d[j]] || {};
            o = o[d[j]];
        }
    }
    return o;
}

然后我可以使用此函数创建一个名称空间,如下所示:

$.namespace("jQuery.namespace1");

一旦我创建了命名空间,我就可以在其中声明函数或任何你想要的东西:

一个功能:

$.namespace1.asyncRequest = function() {
    [function body]
};

常数:

$.namespace1.OFFSET = 10;

一个对象:

$.namespace1.request = { requestId: 5, protocol: 'JSON' };

我认为它简单而优雅: - )

再见 亚历