这对许多人来说可能是一个奇怪的问题,我实际上并不知道在这种情况下说 OOP 是否正确,因为 OOP ( 面向对象编程)通常与编程语言(如C ++和Java)相关联,而不是轻量级编程语言或脚本语言。然而,我的问题是 JavaScript 类别,它也是面向对象的。我做了解对象,属性,方法,原型和构造函数,我似乎无法在使用对象时进入脑海。
当我编写我的网络应用程序时,由于某种原因,我从不使用对象。这让我很烦,因为当我读到各种书籍和在线文章中的对象时,对象会使一切变得如此简单,只是为了把它放在那里,我讨厌重复自己,这就是为什么我希望我知道何时使用物品。
我真的想要更好地使用对象以及何时使用对象。
你能不能提一下几个对象会不错的情况?如果您对使用这些darn对象感到困惑,那么写下你知道可以回去查看的东西真是太好了。)
我希望简单的答案解释为什么以及何时更喜欢物品 我还想告诉我,如果我在某些通常适合对象的特殊情况下使用对象,即每次你想要_________然后你使用一个对象...
我真的希望你理解我的问题,你会认为我对这个网站有些新手并且是JavaScript新手
答案 0 :(得分:10)
你可能在没有意识到的情况下使用对象。
如果您正在编写与DOM交互的Javascript,那么您正在使用对象。
如果您正在使用任何Javascript框架(jQuery,MooTools等),那么您正在使用对象。
当您需要封装一些常用代码时,使用对象将非常有用,以便可以轻松地重复使用(在单个应用程序内或跨多个应用程序,如jQuery插件......它们本身就是对象)。
要回答帖子标题中的问题......在OOP上真正变得更好的唯一方法就是练习!阅读和研究这个主题只能让你到目前为止。
答案 1 :(得分:9)
首先,您不需要使用对象来避免重复自己。如果你需要在代码中的两个点做同样的事情,你可以编写一个普通的非OOP函数来做这个并调用它两次。
为了总结OOP的优点而不在这里写书,OOP基本上为你做了三件事:
将相关数据组合在一起。非OOP程序通常在主程序中浮动一大堆变量,这些变量只是松散相关。使用OOP,可以将相关变量放入对象中。
将功能与数据相关联。通过将函数放在一个带有它们操作数据的对象中(纯粹主义者会说它们是“成员”而不是“函数”),你就会清楚地告诉读者这些数据是一起的。
组合#1和#2可以隐藏其他对象的实现细节。您可以为类创建“公共接口”,其他对象应调用的函数集以及表示此类所执行的逻辑事物,然后可以隐藏所需的任何其他函数。 (在某些语言中比在其他语言中更明确,但这不是重点。)
什么时候开始OOP呢?每当你有几个逻辑上合并在一起的数据时,创建一个类来保存它们是有意义的。像X和Y坐标;或客户名称,地址和邮政编码;或相位器范围和相位器功耗;或者其他什么。
只要您拥有对此相关数据进行逻辑操作的函数,请将它们放入包含数据的类中。比如“大写客户名称”,“计算这一点与原点的距离”等等。
如何以及何时使用继承更复杂。我会再把它留下来了。
答案 2 :(得分:8)
首先要记住的是,很多简单的Javascript代码确实不需要定义对象(使用它们是不可避免的,因为DOM给你的所有东西都是对象)。不要太恐慌。
Javascript的一个好处是它支持许多不同的风格; OOP,命令性和功能性。
使用Javascript的一个坏处是,因为它支持很多不同的样式,所以很难学习另一种风格,至少在你被其他东西强迫进入“a-ha”时刻之前。
花费时间在更倾向于强迫你进入OOP的语言中(即使有些人认为他们不应该这样做)在这里是有用的。 C#和Java强制一个沿着OOP线,虽然C ++没有(这里有与Javascript相同的优点和缺点)。
尝试考虑程序中的“事物”。其中一些东西已经被对象建模(DOM给你的东西)。有些人真的只是数字和字符串而不值得超越(尽管学习如何通过原型向这些类型添加功能也是一个好主意)。有些将是“事物”比简单类型更复杂,并且自然适合作为对象建模。
还要看一下Javascript中的函数式编程(例如,将函数作为参数传递给另一个函数是最简单的例子),因为它和OOP之间的交互是Javascript中最强大的元素之一,并且在定义方法时必不可少在给定基于原型的OOP模型的对象上。
答案 3 :(得分:3)
我在JavaScript中使用OOP的个人经验是积极的,一旦我想出去做我想做的事情,我通常将它与jQuery结合使用,所以结果代码看起来有点......奇
function BlogPost(id,title,content)
{
this.id = id;
this.title = title;
this.content = content;
function display()
{
var post = $('<div class="blogpost"></div>');
$(post).append('<h2>' + this.title + '</h2>');
$(post).append('<p>' + this.content + '</p>');
var deleteButton = $('<span class="deletePost">delete</span>')
$(post).append(deleteButton);
$(deleteButton).click(this.delete)
$('#postcontainer').append(post);
}
function delete()
{
$.post('some/xhr/handeler',{id:this.id});
}
}
这是一个快速(未经测试)的类,可用于动态地将博客帖子添加到具有id postcontainer'的div中,并处理对删除按钮的点击。
答案 4 :(得分:3)
考虑如何使用对象来组织和简化应用程序。我找到了两个有用的比喻:
机械表由多个齿轮组成,每个齿轮在机器的整体操作中起到单一作用。如果您将应用程序视为手表,那么对象就是它的齿轮。
工作组由许多人组成,每个人都执行特定的工作。人们在完成工作时相互沟通,工作分为两类 - 执行任务的人(工人),以及组织和指导其他人(管理人员)工作的工作。
您可以使用这些隐喻来组织应用程序所做的工作。首先将应用程序划分为功能层;例如,UI,业务层和持久性。获取每个用例,并在这些层中分配它所做的工作。这应该为您提供所需课程的起点。
让每个班级都成为一个独立的班级。你希望在完成后将其封锁,就像.NET控件一样。类只能通过它们的接口相互通信,接口由属性和方法组成。这些界面应该具有最小的占用空间(最少的公共属性和方法)。我们的想法是将任何类别的变化的副作用单独隔离到该类。
如果你做这些事情,你将领先80%的程序员。您会发现开发和维护大型应用程序要容易得多,因为您可以将复杂的问题分解为简单的组件。
答案 5 :(得分:2)
Javascript只是学习OOP的一种可怕语言。我建议学习另一种语言(如Java或C ++)的OOP,然后在Javascript中学习面向对象的语法。在那一刻,你拥有所有的成分。
那时您可以决定是否要在Javascript中使用对象作为任务,或者仅仅使用函数就足够了。
就个人而言,我主要编写非对象javascript,并在任务感觉面向对象时保留对象。例如,我使用面向对象设计的拖放脚本,在其中您只需使用正确的参数创建一个DragNDrop对象,并且页面中的项目可以从那一刻开始拖动,或者当我想简化一些javascript时在xml处理函数中,我编写了一个包装普通xml对象的对象。
答案 6 :(得分:1)
Justin Niessner说我和他只能补充他的答案......
除了练习,我发现阅读其他人的代码非常有启发性。你需要保持谨慎,因为并非所有代码都是典型的(至少可以说),但开发关键技能是改善的一部分。
答案 7 :(得分:1)
在我看来,我认为在特定领域或业务问题的背景下考虑OOP会更好。例如,JavaScript使用对象来模拟浏览器行为和属性,例如,窗口,框架,历史......
业务问题的domain model将包含将在编写的OOP编程代码中反映的对象。例如,大学生申请将有学生,教授,课程,课程,房间等对象。因此,从您的业务问题开始并为域建模。您的OOP代码应该具有从您的域建模的对象。
答案 8 :(得分:1)
我认为使用一般的类和OOP原则会使您的代码更整洁,更具可读性并使您的工作效率更高。
答案 9 :(得分:1)
您可能对设计模式(Book,Wikipedia)感兴趣,它告诉您如何使用OOP解决常见问题。 许多经典设计模式可能与JavaScript不太相关,因为在JavaScript中还有其他非OOP元素(例如函数),这可以解决一些更优雅的问题。
我可以推荐一些简单的设计模式:
答案 10 :(得分:1)
最近我在一个需要大量客户端Javascript的Web应用程序上工作。
来自C#/ Java背景我意识到Javascript需要改变思路,但是我仍然希望在可能的情况下应用良好的OO原则,特别是控制应用程序的可能复杂性。
经过一番搜索,我找到了一本名叫Object Oriented Javascript的好书,由Stoyan Stefanov撰写。它真正让我看到了这种通常被称为“玩具语言”的力量。关于函数式编程概念,变量作用域和闭包的一些部分甚至可能比您想要的更高级。
然而,在Javascript中阅读和应用本书中的许多概念(闭包,匿名函数等),实际上甚至帮助我回到C#领域,这些概念现在变得更加主流。
鉴于您所陈述的情况和目标,我强烈推荐这本书作为了解在Javascript中执行OO的最佳方法之一。
答案 11 :(得分:-1)
Javascript比C#或Java更不像面向对象;如果您的Javascript看起来不像面向对象,请不要担心。