面向过程编程到面向对象编程的转换实例

1、面向过程(OP)和面向对象(OO):

    面向过程是是一种以过程为中心的编程思想;

    面向对象主要是把事物给对象化。

 

2、 面向对象编程:适宜大型项目、类库、游戏
      面向过程编程:适宜效果类
 
 
3、对象:1属性  2方法
      类:对象的集合
 
4、创建对象的方法:   对象的首字母一般都大写  Date( )
     ( 1 ) 
      
1  var  obj={ 
2         name:"gfhs"; // 属性
3         show:function( ){    alert(this.name);        }   //方法
View Code

 

}; 
     (  2 )
      
1  var obj=function( ){   //   构造一个类
2             } // 功能不一样  类  构造函数
3         obj.prototype.showNmae=function(){ alert(this.name); };  //原型 
4         var  yue=new obj( );  //给类添加对象
5         yue.name="gfhf";  //给类添加属性
View Code

 

     
     (3 )
        
1 var obj=function( ){  
2         this.name = name;
3         this.show= function(){alert(this.name); }
4         var yue = new obj("wy");//创建对象并赋值
View Code

 

 
    ( 4 )
 1 var Person=function (name,age){
 2 //功能:构造一个类(构造函数)
 3 this.name=name;
 4 this.age=age;
 5 this.showName=function (){
 6 alert(this.name);
 7 }
 8 };//功能:类,构造函数
 9 var tang=new Person("tang","18");
10 var yue=new Person("yue","18");
11 Person.prototype.sex="man";
12 Person.prototype.showSex=function (){
13 alert(this.sex);
14 }
15 tang.showSex();
16 yue.showSex();
17 //添加属性  
18 obj.sex="girl";
19 //添加方法 
20  obj.showSex=function(){    alert(this.sex);       };
View Code

 

 

 
5、属性与变量的区别
     属性:有归属,前面跟有对象
     变量:无归属
 
    方法:有归属
    函数:无归属
 
6、原型的基本格式:
1 String.prototype.index="哈哈";    //对象名.prototype.属性=值;
2 String.prototype.showIndex=function (){  //对象名.prototype.方法名=function( ){ };
3  
4  
5 alert(this.index);
6 }
View Code

 

 
 

7、原型的使用方式

    
1  Date.prototype.getWeek=function (){
2  
3 var arr=["日","一","二","三","四","五","六"];
4 var oDay=this.getDay();
5 // alert("星期"+arr[oDay]);
6 return "星期"+arr[oDay];
7 }
8 var newDate=new Date();
9 alert(newDate.getWeek());
View Code

 

 
8、原型链
function Obj(){};
var wyy=new Obj();
alert(wyy.name);
//1.wyy这个对象上面有没有name->没有
//2.Obj这个对象上面有没有name->没有
//3.Object这个对象上面有没有name->没有,返回undefined,并赋值给wyy
 
9、判断对象类型:
// alert(arr instanceof Array);
// alert(arr instanceof Object);
// alert(arr instanceof Function);
子类  instanceof 父类   ---》ture  or  false
 
10、this的指向     谁调用了,this就是谁
function show(){
alert(this);
}
(1)show();//window
(2) var arr=[1,2];
 arr.show1=show;
arr.show1();    //arr
(3) document.οnclick=show;//document
(4)setTimeout(show,100);//window
(5)new show();//Object
(6)var tang=new show();// Object
 
 
11、面向过程编程---》面向对象编程  以tab切换为例子
面向过程编程的tab切换
 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>Document</title>
 6 <style type="text/css">
 7 div{
 8 height: 100px;
 9 width: 100px;
10 background-color: #ccc;
11 display: none;
12 }
13 </style>
14 <script type="text/javascript">
15 window.onload=function (){
16 var aBtn=document.getElementsByTagName("input");
17 var aDiv=document.getElementsByTagName("div");
18 for (var i = 0; i < aBtn.length; i++) {
19 aBtn[i].index=i;
20 aBtn[i].onclick=function (){
21  
22 for (var i = 0; i < aBtn.length; i++) {
23 aDiv[i].style.display="none";
24 };
25 aDiv[this.index].style.display="block";
26 }
27 };
28 }
29 </script>
30 </head>
31 <body>
32 <input type="button" value="按钮1">
33 <input type="button" value="按钮2">
34 <input type="button" value="按钮3">
35 <div style="display:block">块1</div>
36 <div>块2</div>
37 <div>块3</div>
38 </body>
39 </html>
View Code

 

 
面向过程tab切换
(1)创建构造函数,并别把变量变成属性,既在变量前加上所属对象,此为this
 1 function Tab(){
 2 this.aBtn=document.getElementsByTagName("input");
 3 this.aDiv=document.getElementsByTagName("div");
 4  
 5 for (var i=0; i<this.aBtn.length; i++){
 6  
 7 this.aBtn[i].index=i;
 8 this.aBtn[i].οnclick=function (){
 9  
10 for (var i = 0; i < aBtn.length; i++) {
11 aDiv[i].style.display="none";
12 };
13 aDiv[this.index].style.display="block";
14 }
15 }
16 }
View Code

 

(2)把它的匿名函数抽出来办成一个原型方法
1 Tab.prototype.fnClick=function (that){
2 for (var i = 0; i < this.aBtn.length; i++) {
3 this.aDiv[i].style.display="none";
4 };
5 this.aDiv[that.index].style.display="block";
6 }
View Code

 

(3)在构造函数中引用原型方法,注意此时方法的对象this非Tab( )的this,所以要在this还是正确的时候给this赋给一个变量来保存
 1 function Tab(){
 2  
 3 this.aBtn=document.getElementsByTagName("input");
 4 this.aDiv=document.getElementsByTagName("div");
 5  
 6 var _this=this;
 7  
 8 for (var i=0; i<this.aBtn.length; i++){
 9  
10 this.aBtn[i].index=i;
11 this.aBtn[i].οnclick=function (){
12 _this.fnClick(this);
13 }
14 }
15 }
View Code

 

 
完整代码:
 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>Document</title>
 6 <style type="text/css">
 7 div{
 8 height: 100px;
 9 width: 100px;
10 background-color: #ccc;
11 display: none;
12 }
13 </style>
14 <script type="text/javascript">
15 Tab.prototype.fnClick=function (that){
16 for (var i = 0; i < this.aBtn.length; i++) {
17 this.aDiv[i].style.display="none";
18 };
19 this.aDiv[that.index].style.display="block";
20 }
21  
22 function Tab(){
23  
24 this.aBtn=document.getElementsByTagName("input");
25 this.aDiv=document.getElementsByTagName("div");
26  
27 var _this=this;
28  
29 for (var i=0; i<this.aBtn.length; i++){
30  
31 this.aBtn[i].index=i;
32 this.aBtn[i].οnclick=function (){
33 _this.fnClick(this);
34 }
35 }
36 }
37  
38 window.οnlοad=function (){
39 new Tab();
40 }
41 </script>
42 </head>
43 <body>
44 <input type="button" value="按钮1">
45 <input type="button" value="按钮2">
46 <input type="button" value="按钮3">
47 <div style="display:block">块1</div>
48 <div>块2</div>
49 <div>块3</div>
50 </body>
51 </html>
52  
View Code

 

个人心得:在面向对象编程的过程中最难最纠结的就是this的指向,只要弄清this的指向,编程就会变得轻松。当然对于tab切换这样的效果类使用面向对象编程显然比使用面向过程编程纠结,而面向对象编程在大型项目、类库、游戏中就能显现出它的优势。

转载于:https://www.cnblogs.com/Hfive/p/3586739.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面向对象 1 1 学习方法与要求 1 2 面向对象语言与面向过程语言的区别 7 3 面向对象?什么对象? 8 4 什么是类? 9 5 如何创建一个类Class? 10 6 如何使用类创建对象 10 7 引用与实例 11 8 实例属性与实例方法 11 9 实例属性与实例方法的使用 12 10 实例属性属于实例本身,与其他实例没有关系 13 11 javaBean编码规范 14 12 练习: 15 13 什么构造方法 16 14 构造方法的作用? 17 15 this关键字 17 16 方法调用时的引用传递还是值传递 19 17 面向对象语言的三大特性:封装,继承,多态 20 18 什么是封装?封装在哪? 20 18.1 封装的好处? 20 19 访问修饰符 20 20 面向对象的特性-继承 21 20.1 继承的关键字:extends 21 20.2 继承的语法格式: 21 20.3 继承的好处 21 20.4 Object类 21 20.5 继承是以什么方法实现的? 22 20.6 两个子类的实例,super会指向同一个父类实例吗? 23 20.7 在创建子类实例时,会创建父类实例,先创建哪个? 23 20.8 在子类构造方法中如何调用父类构造方法? 23 20.9 super关键字 24 20.10 父类中私有属性和私有方法可以继承吗? 24 20.11 在代码开发时先开发父类还是先开发子类? 24 20.12 父类是怎么来的? 25 20.13 父类中放的所有子类的共性。子类可以有自己的特性。 26 20.14 方法重写(核心@Override) 28 20.15 练习: 29 20.16 作业题: 31 21 类与类之间的关系 32 22 GC:垃圾回收机制 33 23 Object类 33 23.1 常用方法:boolean equals(Object) 33 23.2 常用方法:String toString() 34 24 继承整理 34 25 面向对象三大特性:多态(核心) 34 25.1 多态的前提? 35 25.2 什么是多态? 35 25.3 父类的引用指向子类实例时,父类引用可以调用哪些方法? 35 26 引用类型的自动类型与强制类型转换 36 27 多态的应用 37 27.1 在使用多态时的一般格式: 37 27.2 练习:创建一个薪资专员(Persionnel),能计算员工工资,负责汇总当月所有员工的总工资数 38 27.3 练习:NewBasePlusSalesEmployee:针对BasePlusSalesEmployee有固定底薪的销售人员,有任务额度10K,满足任务额度正常发放,不满足任务额度发放底薪的80%,提成正常发放。 38 27.4 练习:设计一个形状类Shape 39 28 abstract关键字 41 28.1 abstract可以修饰的对象 41 28.2 抽象方法 41 28.3 抽象类 41 28.4 抽象方法与抽象类的关系 42 28.5 抽象方法与抽象类的使用 42 28.6 abstract的使用场合 42 29 练习:写一个“愤怒的小鸟”: 43 30 final关键字 43 30.1 final可以修饰到3个地方 43 30.2 引用类型加final修饰表示引用不可变 44 31 static关键字 44 31.1 static关键字可以修饰4个地方 44 31.2 静态属性 44 31.3 静态的与实例的 45 31.4 静态代码块 45 31.5 静态方法 45 31.6 静态方法是不能被继承 46 31.7 如何区分静态方法和实例方法的应用 46 31.8 静态导入(1.5新特性) 46 32 单例模式 47 32.1 饿汉模式 47 32.2 懒汉模式 47 33 接口(interface) 48 33.1 如何创建一个接口。 48 33.2 如何使用接口 48 33.3 如何使用类实现一个接口 49 33.4 接口的细节 49 34 接口的应用(面向对象分析) 49 34.1 案例(第一版,使用接口) 50 34.2 案例(第二版) 52 35面向对象设计原则 54 1、找出应用中可能需求变化的代码,把它们独立出来,不要和那些需求不变化的的代码混在一起 54 2、针对接口编程,而不要针对实现类编程 54 3、多用组合,少用继承(包含实现) 54 4、为了交互对象之间的松耦合设计而努力 54 5、类应该对扩展开放,对修改关闭 54 6、依赖倒置,要依赖抽象,不要依赖具体类 54 36 练习:超市收银 54 37 练习:接口表示一种能力,也可以是一种规范 56 38 策略模式 57 38.1 动作冒险游戏 57 38.2 类图 57 38.3 编写使用武器行为接口和实现类 58 38.4 编写角色类和子类 58 38.5 测试类 58 38.6 动作冒险游戏补丁:增加新的角色和新的技能 59 38.7 编写新的打斗行为 59 38.8 编写新的治疗行为和实现类 59 38.9 修改角色父类 60 38.10 修改King类 60 39 披萨工厂 61 39.1 编写披萨父类 61 39.2 编写各种披萨 61 39.3 编写披萨商品类 62 39.4 简单工厂 63 39.5 使用简单工厂修改商店类 63 39.6 使用简单工厂将创建对象代码单独的封装的好处? 64 39.7 使用常量优化工厂类 64 39.8 测试类 65 40 枚举(enum) 65 40.1 创建一个枚举 66 40.2 为枚举创建实例 66 40.3 如何使用枚举的实例 66 40.4 使用枚举优化披萨工厂 67 40.5 枚举类型也可以有构造方法 68 40.6 枚举类型也可以有属性 68 40.7 枚举类型也支持带参数的构造方法。 68 40.8 枚举类型也可以有实例方法 68 40.9 枚举类型也可以支持抽象方法 69 41 内部类 70 41.1 内部类的分类 70 41.2 匿名内部类 70 41.3 成员内部类 71 41.4 静态内部类 72 41.5 局部内部类 73 42 作业 :商超案例,以OOP重构 73
面向对象编程中常用的设计模式有很多,以下是一些常见的设计模式: 1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。 2. 工厂模式(Factory Pattern):定义一个用于创建对象的接口,由子类决定实例化哪个类。 3. 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 4. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,而不影响其原有的行为。 5. 策略模式(Strategy Pattern):定义了一系列算法,并使它们可以相互替换,使得算法可以独立于使用它的客户而变化。 6. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的类可以一起工作。 7. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。 8. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露其内部的表示。 9. 建造者模式(Builder Pattern):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 这些只是一些常见的设计模式,每个设计模式都有不同的应用场景和优缺点。在实际开发中,根据需求选择合适的设计模式可以提高代码的可复用性、可扩展性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值