【问题标题】:JavaScript Usage - OOP, Prototypes, and (not-so) Simple VariablesJavaScript 用法 - OOP、原型和(不那么)简单变量
【发布时间】:2013-09-26 00:53:10
【问题描述】:

我从事 JavaScript 编程已经有一段时间了。我从来没有上过关于最佳实践的课程或阅读指南/书籍,但我似乎已经很好地解决了问题。我知道我的代码并不总是最短和最干净的,但它对我来说很有意义。

我最近接触了面向对象的编程,并认为现在是一头扎进这门语言的好时机。虽然我知道花几天时间研究 OOP 符合我的最大利益,但我有一个具体问题可以帮助我尝试。


制作变量对象

例如,我有一个 PhoneGap 应用程序,其中包含许多功能,每个功能都在拆分的 .js 文件中依次列出。一切正常,但我必须在每个函数之间继续传递相同的几个函数,并且出错的可能性很好。在稍微阅读方法和对象之后,每个页面都演变为这种用法:

var myPage = {
    myVar1 : 'value',
    myVar2 : 32,
    initialize : function() {
        //code that initialized the variables within this object
    },
    doSomething : function() {
        //function that would do something with myPage vars
    }
    //...
};

使用这种方法,每个页面最终都成为一个包含许多方法和变量的大变量。这清理了很多并大大减少了全局变量,但我仍然觉得它并不完美。我的共享 .js 文件被分解为类型和许多对象,每个对象都有自己的功能。我的第一个问题是:这是一件坏事吗?如果是,为什么?如果我能得到关于我的具体用途的解释,那将比在教科书和指南中看到最佳示例更让我受益。


使用单个实例制作原型和类

查看此处提供的示例以及网络和死树出版物中提供的示例,我看到对象和原型行为被定义为一个类,然后创建该类的实例。然而,我需要做的任何事情似乎都不符合这个预算,而且我几乎可以肯定这是因为我根本没有以正确的范式思考。但是,如果我有一个验证输入的函数,它如何适应更好的 OOP 方法

我只是有一个名为validate 的变量/对象,其中包含必要的函数,然后将该变量放入共享文件中。如果我将它创建为一个类并在每次需要验证某些内容时创建它的一个实例,那不会产生更多的开销吗?我看不出它如何适用于这样的应用程序。


我认为 OOP 是必经之路,我想成为其中的一员。提前感谢所有答案和 cmets。

【问题讨论】:

  • 顺便说一句,ECMAScript 6 将是使用 javascript 的 OOP 模式的一个进步。尽管使用 Prototypes 仍然可以实现,但在学习 OOP 时,类往往更容易掌握。 ECMAScript 6 还没有出现,但是有一些替代方案可以编译到当前的 javascript。即微软的 TypeScript 和谷歌的 Traceur。这两者都允许您使用 OOP 进行编码并编译为 Javascript。令所有人惊讶的是,我认为微软提供了我提到的两者中更好的选择。
  • 你应该阅读依赖注入并尝试 require.js。听起来这将是您当前拥有的模型的平稳过渡。
  • francisco.preller:我觉得这很有趣,但是 OOP 的现状仍然很陌生,以至于我还没有准备好迎接那么大的转变。谢谢bfavaretto;这对我来说似乎是一个很好的中间立场。

标签: javascript oop cordova


【解决方案1】:

我的第一个问题是:这是一件坏事,如果是,为什么?

有能力的开发人员避免在全局范围内定义函数(当您在脚本中编写 function() {} 时所做的事情),因为它会污染全局范围,而许多其他脚本都试图这样做。把它想象成我们中的许多人都试图在同一页面上制作更好的“share()”函数——只有我们中的一个人会赢。

我看到对象和原型行为被定义为一个类,然后创建该类的实例。然而,我不需要做的任何事情似乎都符合这个预算,而且我几乎可以肯定这是因为我根本没有以正确的范式思考

在那里你无能为力。如果你有一个验证输入的函数,那么作为元素的一部分会更好:

someElement.validate();  // as a prototype

而不是传统的

validate(someElement);  // as a global function

【讨论】:

  • 感谢您提供详细信息。那么全局范围被其他人定义的匿名函数污染了吗?是否曾经回收过,您认为什么是更好的选择?从调用到回调,我使用function() {}。谢谢。
  • vars 在匿名函数中声明不会污染全局范围,因为它们不在全局范围内。请参阅this famous question 了解 JS 范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2012-05-17
  • 2013-05-30
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多