如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
How to write a tidy and flexible complex javascript application using prototypal inheritance
一段时间以来,我一直在开发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 的主要作者
- Rails引擎:使主机应用程序javascript可用于Mounted Engine
- Windows 8应用程序Javascript和SQlite(数据库已锁定)
- 是否有一种从应用程序Javascript代码中自动生成序列图的方法
- 未捕获的语法错误:) 在 MVC 应用程序 JavaScript asp.net 参数列表后丢失
- 如何将excel文件导入Web应用程序(javascript/d3/html)
- 检查是否没有Internet连接-弹出-Windows 10应用程序(Javascript)
- 如何在WinRT应用程序(Javascript、C#)中区分Windows Phone 8.1和Windows 8.1
- jQuery Mobile Windows应用商店应用程序:JavaScript运行时错误:无法获取属性'ind
- Web应用程序Javascript,用于处理来自iOS设备摄像头的信息流(不是应用程序!)
- 在构建应用程序Javascript MVC的过程中,score/buildjs抛出了一个没有解释的错误
- Iframe应用程序JavaScript SDKpublish对话框错误(代码102)
- 如何在windows8商店应用程序(javascript)中播放youtube视频
- AJAX应用程序JavaScript加载问题
- 用于在纯客户端测试应用程序(javascript/jquery)中维护状态和管理i/o的体系结构
- 来自IOS本机应用程序JavaScript函数调用
- 添加必应地图到Windows Phone 8.1应用程序(javascript)
- 消息对话框用户选择Metro应用程序- JavaScript
- 天气应用程序Javascript无法工作
- 需要的应用程序(JavaScript混淆器)
- 我可以在WinRT应用程序(javascript)中使用Sqlite吗?