1、面向过程(OP)和面向对象(OO):
面向过程是是一种以过程为中心的编程思想;
面向对象主要是把事物给对象化。
2、
面向对象编程:适宜大型项目、类库、游戏
面向过程编程:适宜效果类
3、对象:1属性 2方法
类:对象的集合
4、创建对象的方法: 对象的首字母一般都大写 Date( )
( 1 )
1 var obj={ 2 name:"gfhs"; // 属性 3 show:function( ){ alert(this.name); } //方法
};
( 2 )
1 var obj=function( ){ // 构造一个类 2 } // 功能不一样 类 构造函数 3 obj.prototype.showNmae=function(){ alert(this.name); }; //原型 4 var yue=new obj( ); //给类添加对象 5 yue.name="gfhf"; //给类添加属性
(3 )
1 var obj=function( ){ 2 this.name = name; 3 this.show= function(){alert(this.name); } 4 var yue = new obj("wy");//创建对象并赋值
( 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); };
5、属性与变量的区别
属性:有归属,前面跟有对象
变量:无归属
方法:有归属
函数:无归属
6、原型的基本格式:
View Code1 String.prototype.index="哈哈"; //对象名.prototype.属性=值; 2 String.prototype.showIndex=function (){ //对象名.prototype.方法名=function( ){ }; 3 4 5 alert(this.index); 6 }
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());
8、原型链
function Obj(){};
var wyy=new Obj();
alert(wyy.name);
//1.wyy这个对象上面有没有name->没有
//2.Obj这个对象上面有没有name->没有
//3.Object这个对象上面有没有name->没有,返回undefined,并赋值给wyy
// 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.onclick=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>
面向过程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].onclick=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 }
(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 }
(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].onclick=function (){ 12 _this.fnClick(this); 13 } 14 } 15 }
完整代码:
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].onclick=function (){ 33 _this.fnClick(this); 34 } 35 } 36 } 37 38 window.onload=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
个人心得:在面向对象编程的过程中最难最纠结的就是this的指向,只要弄清this的指向,编程就会变得轻松。当然对于tab切换这样的效果类使用面向对象编程显然比使用面向过程编程纠结,而面向对象编程在大型项目、类库、游戏中就能显现出它的优势。