精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
面向对象技术是一种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。它以数据为中心而不是以功能为中心来描述系统,数据相对于功能而言具有更强的稳定性。它将数据和对数据的操作封装在一起,作为一个整体来处理,采用数据抽象和信息隐蔽技术,将这个整体抽象成一种新的数据类型——类,并且考虑不同类之间的联系和类的重用性。类的集成度越高,就越适合大型应用程序的开发。另一方面,面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际。事件驱动程序的执行围绕消息的产生与处理,靠消息循环机制来实现。在实际编程时可以采用搭积木的方式来组织程序,站在“巨人”的肩上实现自己的目标。面向对象程序的设计方法使得程序结构清晰、简单,提高了代码的重用性,有效减少了程序的维护量,提高了软件的开发效率。[
对象的产生有两种基本方式。一种是以原型(prototype)对象为基础产生新的对象。一种是以类(class)为基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性, 原型模型 本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符合实际应用的对象。而原型-委托也是OOP中的对象抽象,代码共享机制中的一种。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾,比较典型的就是在继承体系下,子集(子类)对象和父集(父类)对象之间的行为相融性可能很难达到,这也就是OOP中常被引用的—子类型(subtype)不等于子类(subclass)[Budd 2002]。而在一种所有皆对象的世界观背景下,在类模型基础上还诞生出了一种拥有元类(metaclass)的新对象模型。即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了三种基于类(class-based),基于原型(prototype-based)和基于元类(metaclass-based)的对象模型。而这三种对象模型也就导致了许多不同的 程序设计语言 (如果我们暂时把 静态 与动态的差别放在一边)。是的,我们经常接触的C ,Java都是使用基于类的对象模型,但除此之外还有很多我们所没有接触的OOPL采用了完全不一样的对象模型,他们是在用另外一种观点诠释OOP的内涵。
封装 (Encapsulation) 简单的理解就是将需要做的事情定义成为一个具有参数的函数,只对外提供传参数的接口,方便多次调用来处理某些参数不同,但实际过程一样的事情。
简单的封装的例子:
function fn(a){alerta;};
继承 (Inheritance) 继承在js里面的实现可以通过构造函数,原型来实现。将需要继承的属性,方法写在原型上,创建出来的实例对象就有个属性指向构造函数的原型,能够获取到上面的属性和方法。
例如:functionPerson(name){this.name =name;
}
Person.prototype.getName= function(){
alert(this.name)
}
var person1 =new Person(‘Paul’);
新对象person1继承了Person的getName方法
多态 (Polymorphism) 同一操作作用于不同的类的实例,将产生不同的执行结果。很明显.
如下面的例子。
var person1 =new Person(‘Paul’);
var person2 =new Person(‘Jack’);
person1.getName(); //’Paul’
person2.getName(); //’Jack’
调用了同样的方法,但是结果不同,实例是多态的,结果也是多态的。
我们总结面向对象就是对现实世界理解和抽象的方法。什么现实世界?简单说就是我们看到的东西。对现实的理解和抽象?就是将看到的同类的东西概括出来。
我们可以把对象理解成一个人,人的外貌就是公有属性,大家可以很直观地看到。而人的身体状况例如脉搏跳动次数,消化能力这些就是私有属性,因为这些属性是客观存在的,但人不能直接知道。别人对你说一句话,做不同的动作,你会有思考,思考过程就是调用了私有函数,别人是不知道你思考了什么的,思考完后你会作出反应,或者做一个动作,或者回答别人,这就是别人调用了你听觉,视觉这个公有函数。
明白了对象是什么,我们就知道怎么去面向他。首先我们要设计出这样的“人”,然后我们就可以根据这个人的不同“性格特点”来获取我们想要的信息。
普通函数封装我感觉只能算是一个面向对象的雏形,一个过渡的东西,构造函数封装才是面向对象的起点。因为用了构造函数式的写法后,你才能基于类进行修改,比较一下就能发现,普通函数封装就是一个函数,就算他也算是一个‘类’,但他不能扩展,方便的调取到类的属性。而且,最重要的特性:继承,普通的函数封装做不到吧。比如要从‘车’类里面继承出一个‘跑车’类,普通封装很难写出来吧。这里还没考虑代码重复,公有方法重复等等