2015-09-18 43 views
0

现在我有以下的静态类在我的应用程序:静态类的对象字面

function Tools() { } 
Tools.someFunction = function(arg1, arg2) { 
    // do something 
}; 

但我改变了我的js文件的架构,一个对象包含所有类的文字,所以我需要这样的东西:

var app = { 
    someController: function() { 

    }; 
    tools: function() ... 
}; 

其实我有两个问题: - 这是JavaScript的一个很好的架构来包装在一个大的对象中的所有代码? - 我该如何将这个静态类附加到这个文字上?

+0

两者都很好,但我认为第二个更好,因为在它里面我们也可以有私有函数和变量。但都很好 –

+0

第一个也可以有私人功能.. – Rayon

+0

旁注:OOP没有“静态类”的概念。有静态_members_(方法或属性),而不是_classes_。虽然只包含静态成员的类可能被称为静态,但这只是一个缩短的术语,而不是单独的概念。 – hindmost

回答

1

首先,解雇词并使用原型。 ECMA-Script 6及以上版本正在引入基于类的面向对象编程,但您的代码似乎正在使用基于原型的继承系统。那么,事实上,你只是使用的构造函数来创建对象。

使用正确的术语是与社区沟通的良好开端。其次,在JavaScript中没有静态类。函数在JavaScript中是必不可少的,它们仍然是对象。与对象类似,函数是可扩展的,您可以添加属性,除非您在其上调用Object.preventExtensions

这只是你的构造函数也有一个属性持有一个函数。

如果你要认为构造函数为您app对象的一部分,将其添加为一个普通的属性:

var app = { 
    Tools: function() {} 
}; 

app.Tools.someFunction = function() { 

}; 

这是JavaScript的一个很好的架构来包装所有的代码在一个大 目的?

当然。但使用模块模式。网上有大量关于这个话题的文章。您可能需要查看其他Q & A:why module pattern?

+0

“你的代码仍在使用基于原型的继承系统” - 我在想它在哪里。否则,这是我会推荐的答案。 :) – Pavlo

+0

@Pavlo哈哈,这就是为什么我添加了部分**呃,实际上,你只是使用构造函数创建对象。** ... –

+1

@Pavlo检查我的编辑......我'D'改写了句子:D –

0

这是一个很好的架构来将所有代码封装在一个大对象中吗?

不是真的在这个时代。当然,这种方法可以将全局名称空间上的脚印缩小为单个名称,如app。但使用ES6模块可以更轻松地完成相同的任务。转移非常容易。你可以继续写

function Tools() { } 
Tools.someFunction = function(arg1, arg2) { 
    // do something 
}; 

因为你之前,但增加

export default Tools; 

然后,您要使用此

import Tools from 'tools'; 
Tools.somefunction(); 

我怎么可以追加静态类这个字面意思?

有了ES6模块,您不需要,但在这里的许多问题中描述了许多模式。一些例子:

IIFE:

var app = { 
    someController: function() { 
    var f = function() { }; 
    f.someProp = 42; 
    return 42; 
    }(), 

初始化程序:

var app = { 
    someController: function() { }, 
    init: function() { 
    this.someController.someProp = 42; 
    return this; 
    } 
}.init(); 

明确划分:

var app = { 
    someController: function() { } 
}; 
app.someController.someProp = 42; 

这些都不是很好玩的读取或写入。他们对2012年的感觉有些类似。使用ES6模块来避免这种情况,并回到编写常规旧代码。