2

一段时间以来,我一直在开发 javascript 应用程序,通常是较小的脚本来完成简单的任务,但也是一个相当大且复杂的应用程序,它使用Dean Edwards 的 base2 库来创建具有继承的伪经典 OO 类,......在 javascript 中。

base2 库为我提供了很好的服务,主要是因为它使我能够遵循我非常熟悉的经典 OO 范式。我还知道其他几个可用于构建更强大和成熟的 javascript 应用程序的框架(例如, backbone.js )。但我总觉得这种类型的库是一种“作弊”的方式,即构建一种使用该语言实际上不适合的原则编写代码的方式。

我一直在阅读定义对象/函数、实例化它们以及使用原型继承实现多态性的不同方法。这实际上是该语言在基本层面上的工作方式,我觉得我应该利用这一点,而不是认为它很烦人或很奇怪,并试图找到一种方法来按照我习惯的方式做事(经典的 OO 方式)。

因此,查看不使用此类库的应用程序,似乎有很多方法可以编写您的应用程序,而对于 Java、C++ 等传统通用语言......构建应用程序的正确方法似乎更明确(区分好代码和坏代码要容易得多)。如果明天有人问我:“开始为我开发 projectX”,我将不知道如何开始定义和构建我的对象,我可以确定当重组为时已晚时不会回来咬我整个东西。

一个专业的复杂 js 应用程序骨架会是什么样子,使用原型继承,所以不使用任何类型的库来模仿经典的 OO,假设一个简单的 MVC 类型的应用程序,但很容易扩展到更复杂的比例。如何定义我的对象?如何将对象/“类”组合在一起(命名空间)?换句话说:如何做到这一点,而不至于陷入无人理解的混乱局面?

4

1 回答 1

6

在创建面向对象的 Javascript“类”时,我遵循了两种模式(认为 JS 中没有真正的类,我们可以模仿它们)。首先是更熟悉的 OO 方式并且易于理解。

// in JS, functions can be used as OO classes
var Person = function(name) {
    var self = this;

    //private methods and attributes
    this.getNickname = function(){
        return "Yaka";
    };

    //public methods and attributes (return obj)
    return {
        getName : function() {
            return name + ' ' + self.getNickname();
        }
    }
};

//static functions attached to 'Person' class 
Person.hasBrain = function() {
    return true;
}

该模型允许您为您的类提供私有、公共和静态部分,从而实现良好的封装。但这不是最佳方式,因为每个对象都会携带它自己的所有实例方法的副本。您可以避免使用基于原型的编程的实例方法的多个副本:

// in JS, functions can be used as OO classes
var Person = function(name) {
    this.name = null;
};

// use of prototypes improves performance and memory use
Person.prototype.getName = function() {
    return this.name;
}

Person.prototype.setName = function(name) {
    this.name = name;
}   

这对于传统的 OO 程序员来说看起来不是很熟悉,但却是使用 javascript 资源的最佳方式。它也适用于继承。

var Manager = function() {}
Manager.prototype = new Person();

在实践中,我对应用程序中大量使用的基础/框架类使用原型方法。对于偶尔或少数情况下使用的类,我使用之前讨论过的方法。

我还建议您使用 AMD 库,例如 requirejs,并为每个物理文件定义一个类。然后使用构建优化器将您的文件优化为单个脚本。

我从BoilerplateJS参考架构中的单元测试中复制了上述两种方法。看看 BoilerplateJS 中的代码,它将为您提供更多关于如何使用 JS 进行复杂应用程序开发的想法。

免责声明:我是 BoilerplateJS 的主要作者

于 2012-09-05T06:17:54.987 回答