- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一段时间以来,我一直在开发 javascript 应用程序,通常使用较小的脚本来完成简单的任务,但也有使用 Dean Edwards' base2 library 的相当大且复杂的应用程序。用于创建具有继承的伪经典 OO 类,......在 javascript 中。
base2 库对我非常有用,主要是因为它使我能够遵循我非常熟悉的经典 OO 范例。我还知道其他几个可用于构建更健壮和成熟的 javascript 应用程序的框架(例如 backbone.js)。但我总觉得这种类型的库是一种“作弊”方式,即使用该语言实际上不适合的原则来构建一种编写代码的方法。
我一直在阅读有关定义对象/函数、实例化它们以及使用原型(prototype)继承实现多态性的不同方法。这确实是语言在基本层面上的工作方式,我觉得我应该利用它,而不是认为它很烦人或奇怪,并试图找到一种方法来按照我习惯的方式做事(经典的 OO 方式) ).
所以,看看那些没有使用这种类型的库的应用程序,似乎有很多方法可以编写您的应用程序,而对于传统的通用语言,如 Java、C++...,构建应用程序的正确方法似乎定义更明确(区分好代码和坏代码要容易得多)。如果明天有人问我:“开始为我开发 projectX”,我将不知道如何开始定义和构建我的对象,这样我可以确定在重组为时已晚时不会回来咬我整个事情。
如果使用原型(prototype)继承,专业的复杂 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;
}
此模型允许您为类提供私有(private)、公共(public)和静态部分,从而实现良好的封装。但这不是最佳方式,因为每个对象都会携带它自己的所有实例方法副本。您可以通过基于原型(prototype)的编程避免实例方法的多个副本:
// 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();
在实践中,我对应用程序中大量使用的基类/框架类使用原型(prototype)方法。对于偶尔使用或很少使用的类,我使用之前讨论的方法。
我还建议您使用 AMD 库,例如 requirejs,并为每个物理文件定义一个类。然后使用构建优化器将文件优化为单个脚本。
我从 BoilerplateJS 中的单元测试中复制了以上两种方法引用架构。看看 BoilerplateJS 中的代码,它会给你更多关于如何使用 JS 进行复杂应用程序开发的想法。
免责声明:我是 BoilerplateJS 的主要作者
关于javascript - 如何使用原型(prototype)继承编写整洁灵活的复杂 javascript 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265219/
我正在使用这种代码: document.write("foo 使用 HTML tidy 后,表格外的 script 标签被移除,因此破坏了页面布局。我
我正在为我的网格系统使用 Bourbon 的 Neat 库。 我有这样的代码: section { @include outer-container; aside { @include spa
我有三个文件。 header.php index.php footer.php 头文件包含来自至 索引文件包含页面内容页脚文件包含 至 它们一起包含一个带有 PHP 的普通 HTML 文件 当我使用
我有一个格式有点乱的 Objective-C 代码库。有没有办法让 Xcode 重新格式化整个项目以符合编码标准(即正确缩进、空格与制表符等)?是否有其他工具可以完成此任务? 最佳答案 去壳化:htt
我试图自己实现整洁,使用原始论文但被卡住了。 假设在上一代我有以下物种: Specie 1: members: 100 avg_score: 100 Specie 2: memb
我正在尝试整理我的一些 SKScene 代码。目前我有大约 11 个对 SKNode 的引用(有些是包含子节点的层)。这些节点及其子节点被类频繁访问。我考虑这样做的方式是: 将所有 SKNode 子类
Notepad++ 的 HTML Tidy 坏了吗?除了 Tidy(第一个)之外,所有命令都不起作用。他们不显示任何消息,即使选择了所有文本。我真的需要 Tidy 才能工作,还是它只是最新版本 N++
有没有一种方法可以不使用 rowwise() 来创建 key? 非常感谢任何指针。 df % rowwise %>% mutate(key=paste(sort(c(grp1, grp2)), col
我正在尝试使用作为 PHP (http://www.php.net/manual/en/book.tidy.php) 一部分的 HTML Tidy 实现来重新格式化大量 HTML。我遇到了一个问题,其
我为 Sublime Text 2 安装了 phptidy 插件,并尝试用它来清理一些丑陋的代码,比如 $tdt="
我在 Windows 的命令行环境中使用 HTML Tidy。我需要强制将一些 html 文件转换为 xml,即使有错误也是如此。 我执行以下步骤: 创建文件“conf.txt”,其内容为: 强制输出
我正在重写一个使用 Bourbon 的“旧”React 原型(prototype),它还在 gulpfile 中使用 gulp-sass 来注入(inject)节点整洁的依赖项: var sassOp
我正在创建一个供个人使用的 jQuery Accordion 插件。 我的主要目标是拥有 super 简洁的 JS 代码和 HTML 结构。 这就是我已经走了多远 http://jsfiddle.ne
我正在测试 Bourbon Neat,我在一个外容器中有两列,我希望这些列的高度相等(与最高的列一样高)。在短列上使用 @include fill-parent 不起作用,它只会使它与外部容器一样宽。
大多数时候在 repos 中,我们看到一个 PR,然后是那个 PR 的 merge 提交,它只是说“Merged pull request #XXX from ...”。 但最近,我看到了一个紧凑的版
我正在使用 Neat 的 12 列网格。该页面由延伸整个网格宽度的部分组成。部分背景与页面背景不同: 如您所见,粉红色部分的左侧与网格边缘齐平。我想要的是该部分的左侧超出网格几个雷姆。 但是,如果我添
只是出于好奇而提出的简单问题。 类上的多个方法需要使用字符串流,或者特别是 ostringstream。 1) 有一个 stringstream 变量作为类成员,然后在使用它之前清除它,即 msg.s
我是波旁/整洁的新手。我有一个关于嵌套的问题:我希望红色框填充整个宽度,而彼此之间不要有排水沟。当在其上使用“@include omega”时,第一个框将删除其右边距,但是右边的框仍具有边距,并且不会
GWT(Google Web Toolkit)是否有一个功能可以漂亮地打印小部件的 html 输出? (如果问题措辞不当,我深表歉意——我不是 GWT 开发人员,但我们的开发人员声称没有办法做到这一点
我是一名优秀的程序员,十分优秀!