参考:
- http://www.cnblogs.com/TomXu/archive/2012/02/03/2330295.html
- http://www.10tiao.com/html/663/201511/409843159/1.html
OOP 模式没有正式的标准规范。没有一个技术文档定义了什么是 OOP,什么不是 OOP。OOP 定义主要基于早期研究人员,如 Kristen Nygaard, Alan Kays, William Cook 等人发表的论文中的常识。
在乔布斯之前,我还没有见过有人能对面向对象编程做出更恰当的解释。乔布斯从来没有接受过正式的工程训练,但是他对于自己所做的和所说的都有非常清晰的思路,无论是技术、设计还是艺术
**Jeff Goodell:**请你用尽量简练的语言解释一下,究竟什么是面向对象的软件?
**乔布斯:**对象就像人一样,也是活生生的生命。他们有知识,知道怎么完成任务;他们有记忆,可以把发生的事情记下来。而你和他们的互动并不是低层次的,你是与他们在一个高度抽象的层面上互动,就像我们现在的对话一样。
我举个例子来说明。如果我是一个“洗衣”对象,你可以把脏衣服给我,然后告诉我说:“请帮我把这些衣服洗了吧!”而我恰好知道旧金山最好的洗衣房在哪,并且我会说英语,兜里也有美元。于是我出门打了一辆出租车,告诉司机带我去位于旧金山的洗衣房。我到了那里洗好衣服之后,又坐车回到这里。我把洗好的衣服交还给你,说:“你的衣服已经洗好了。”
你并不知道我是怎么做到的。你不知道哪里有洗衣店,也可能只会说法语,或者是兜里没钱,连车都打不了。但是我知道怎么完成这项任务,而你不需要知道任何细节。所有的这些复杂流程都隐藏在我的内部,而我们之间可以高度抽象地互动。这就是对象。他们把复杂过程封装在内部,而对外呈现的接口是高层次的,抽象的。
我怎么觉得乔布斯说的只是封装,呵呵~
如果语言满足以下要求:
-
封装:专注于数据和操纵代码的单一实体,并隐藏其内部细节的能力。
-
继承:一个对象从一个或多个其他对象获取某些或所有要素的机制。
-
多态:根据数据类型或结构不同地处理对象的能力。
ECMAScript 中面向对象编程的定义:
ECMAScript 是基于原型实现的面向对象编程语言。
基于原型的 OOP 和基于静态类的方式直接有很多差异
类代表了一个实例(也就是对象)的抽象
在基于类的模型中,有个关于类和实例的概念。 类的实例也常常被命名为对象或范例 。
- 创建一个对象之前,必须声明类,首先有必要界定其类
- 因此,该对象将由抽象成自身“象形和相似性”(结构和行为)的类里创建
- 方法是通过了严格的,直接的,一成不变的继承链来处理
- 子类包含了继承链中所有的属性(即使其中的某些属性是子类不需要的);
- 创建类实例,类不能(因为静态模型)来改变其实例的特征(属性或方法);
- 实例(因为严格的静态模型)除了有该实例所对应类里声明的行为和属性以外,是不能额外的行为或属性的。
在 JavaScript 里如何替代 OOP 模型,也就是我们所建议的基于原型的 OOP
这里的基本概念是动态可变对象