是否有一种管理javascript类的新方法?

时间:2011-04-23 01:00:35

标签: javascript class class-design

有谁知道结构化javascript是否会被更改?我的意思是有一种方法将javascript类管理到包中,就像在Java中一样。有没有办法?

5 个答案:

答案 0 :(得分:4)

我想您熟悉在您拥有的域之后命名包的Java概念,这样可以避免与其他供应商的包冲突。您可以使用以下命令模拟Java包(并避免可能的空间冲突):

if (typeof(org) == "undefined")
    org = {};

if (typeof(org.mydomain) == "undefined")
    org.mydomain = {};

if (typeof(org.mydomain.mypackage) == "undefined")
    org.mydomain.mypackage = {};

org.mydomain.mypackage.MyClass = function (newA) {
    // constructor
    this.a = newA;
}

org.mydomain.mypackage.MyClass.staticMethod = function () {
    // static method
    return "static";
}

org.mydomain.mypackage.MyClass.prototype.method = function () {
    // normal method
    return a;
}

var o = new org.mydomain.mypackage.MyClass(13);
console.log(o.method());
console.log(org.mydomain.mypackage.MyClass.staticMethod());

如果您在有限的范围内工作,甚至可以模拟Java的import。 (在全球范围内这样做会消除整个包装点):

function afunc() {
    var MyClass = org.mydomain.mypackage.MyClass;

    var o = new MyClass(33);
    console.log(o.method());
    console.log(MyClass.staticMethod());
}

这里最薄弱的链接是我们的命名空间的根,org(或com或任何顶级域名)。另一类可能出于某些其他原因使用它。使用org_mydomain作为根而不是org.mydomain可能会带来一定的安全性。

修改

如果您想避免使用TLD作为根,那么您还有其他可能的根名称。如果您的域名足够独特(例如,像 foogz.com 这样的一个错误拼写错误的域名),您可以假设没有其他公司会编写可重复使用的JavaScript类,这些类将用于foogz.orgfoogz.biz,所以你可能会成为唯一的 foogz 。 :)

另一种可能性是将您的TLD附加到域名,并将其用于第一个标记,例如:mydomainorg.packagename.ClassName

答案 1 :(得分:3)

没有JavaScript类。只有对象。您可以将一堆对象打包到另一个对象中,如果您愿意,可以将其视为模块/命名空间。 (最后的例子。)

因此,JavaScript类中没有任何“改进”,因为没有任何“改进”,我希望也不会有。坦率地说,这是最好的。你宁愿处理疯狂的getter / setter,静态成员,受保护,类型胁迫等等吗?原型继承以英里为单位击败“经典继承”。只是JavaScript没有太多时间才能做到恰到好处。

关于JavaScript对象如何工作的惊人解释,我推荐Douglas Crockfords'"On JavaScript"some answers来自我们自己的成员。

“命名空间”的一个例子:

var obj = {

    classRoom : {...},
    objectify : function() {...},
    capacity : 5
};
var myClass = obj.classRoom; //access it like you access a module
var capacity = 7; //this is a global variable named capacity, so it won't tamper with obj.capacity

答案 2 :(得分:0)

JavaScript是文件中的动态代码。您所做的只是加载一些源代码并动态运行它。

每个结构和管理系统都是在运行时动态编写和完成的。有很多方法可以管理和构建javascript代码。

我个人推荐requireJS,因为它没有绑定到任何框架/其他库。

答案 3 :(得分:0)

查看http://joose.it,它有一个很棒的模块系统(库,而不是语言扩展)。 ECMA-262规范的第4版有软件包,它在actionscript中实现。

答案 4 :(得分:0)

有一些猜测(例如John Resig)关于可能添加到ECMAScript Harmony的对象冻结和包等新功能(a.k.a第6版)。

但是,我个人怀疑语言委员会会考虑对语言处理其一些核心OO原则的方式进行如此大的改变。