如何使用原型继承编写一个整洁灵活的复杂javascript应用程序

How to write a tidy and flexible complex javascript application using prototypal inheritance

本文关键字:应用程序 javascript 复杂 一个 继承 原型 何使用      更新时间:2023-09-26

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

base2库对我非常有用,主要是因为它使我能够遵循我非常熟悉的经典OO范式。我还知道其他一些框架可以用来构建更健壮、更成熟的javascript应用程序(例如backbone.js)。但我一直觉得这种类型的库是一种"作弊"的方式,用这种语言实际上不适合的原则来构建一种编写代码的方式。

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

因此,对于不使用这种库的应用程序,似乎有很多方法可以编写应用程序,而对于Java、C++、。。。构建应用程序的正确方式似乎定义得更清楚(区分好代码和坏代码要容易得多)。如果明天有人问我:"开始为我开发projectX",我不知道如何开始定义和构建我的对象,我可以肯定,当重组整个事情为时已晚时,我不会回来咬我。

如果使用原型继承,专业复杂的js应用程序骨架会是什么样子,那么不使用任何类型的库来模仿经典OO,假设应用程序是简单的MVC类型,但可以轻松扩展到更复杂的比例。如何定义我的对象?如何将对象/"类"分组在一起(命名空间)?换言之:如何做到这一点,而不会陷入无人理解的混乱?

在创建面向对象的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 的主要作者