Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用原型继承编写整洁灵活的复杂javascript应用程序_Javascript_Oop_Architecture_Prototypal Inheritance - Fatal编程技术网

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

如何使用原型继承编写整洁灵活的复杂javascript应用程序,javascript,oop,architecture,prototypal-inheritance,Javascript,Oop,Architecture,Prototypal Inheritance,一段时间以来,我一直在开发javascript应用程序,通常是较小的脚本来完成简单的任务,但也是一个相当大和复杂的应用程序,用于创建具有继承性的伪经典OO类,。。。在javascript中 base2库为我提供了很好的服务,主要是因为它使我能够遵循我非常熟悉的经典OO范式。我还知道其他几个框架可以用来构建更健壮、更成熟的javascript应用程序(例如)。但我总觉得这种类型的库是一种“欺骗”的方式,用这种语言实际上不适合的原则来构造一种编写代码的方式 我一直在阅读定义对象/函数、实例化它们以及

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

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

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

<> P> >,在不使用这种类型的库的应用程序中,似乎有很多方法编写应用程序,而对于传统的通用语言(如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中的代码,它将为您提供有关如何使用JS进行复杂应用程序开发的更多想法


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

为什么不花点时间看看当前流行的框架,如主干、Ext、Ember、Angular等?即使你不喜欢它们,也很容易接触到架构模式。我确实看过其中一些,但由于许多差异,我仍然不清楚最好的方法。也许这是一个过于主观的问题。是的,这是一个相当主观的问题——我个人发现我很少在JavaScript中使用继承,因为我更喜欢通过语言的功能方面实现代码重用。另外,我个人不喜欢客户端应用程序逻辑的想法;我有很多客户端代码,但它是关于客户端特性的,而不是关于应用程序逻辑的。但这只是我个人的情况和看法。我喜欢阅读所有这些框架的功能,因为我喜欢了解设计方法和编码技术。我知道您不喜欢在客户端上有太多的应用程序逻辑,但根据您创建的应用程序的类型,有必要在客户端上有这种结构。在我的例子中,我必须编写一个工具来在浏览器中设计可打印的pdf文件,它有一个相当大的前端来创建包含文件页面、元素、元素属性等的模型对象。在这样的应用中,它不是可选的,除非您的用户不介意等待太久:),即使如此,这样一个应用程序的逻辑量需要一个像样的结构。是的,我的个人情况涉及到一个金融应用程序,所以我所有的“严肃”逻辑都需要站在防火墙这边:-)正因为如此,我对一个两边都包含对象模型的架构的想法感到不舒服。因此,我的客户机代码都是关于使视图工作的,它的体系结构致力于解决这个问题,而不是应用程序逻辑。我相信我是这里与众不同的人。您所描述的内容听起来正是现代JavaScript框架设计用来解决的问题。