1、面向对象术语
1.1、面向对象语言的要求
1)封装
2)聚集
3)继承
4)多态
2、对象的类型
在ECMAScript中,所有对象并发同等创建的。一般来说,可以创建并使用的对象有三种。
2.1、本地对象
本地对象(native object) :就是ECMA-262定义的类(引用类型)。例如
Object function array String Boolean Number Date等。
这里重点讨论Array, Date 对象
2.1.1、Array类
声明方法
数组申明
var aValues=new Array();
//预先知道大小
var aValues=new Array(20);
var aColors=new Array("red","green","blue");
//数组可以根据需求自动增大变小
var aColors=new Array("red","green","blue");
alert(aColors.length); //output 3
aColors[3]="yellow";
alert(aColors.length); //output 4
//上一段代码中,数组下一个没有使用的位置是索引3,如
//果把“yellow”放到数组的第25个位置呢?答案是数组将
//把2 - 25之间的位置都天上null,然后在索引25插入值
//数组的长度将变成26
var aColors=new Array("red","green","blue");
alert(aColors.length); //output 3
aColors[25]="yellow";
alert(aColors.length); //output 26
数组的基本函数应用
Code
//Array类覆盖了valueOf(), toString()方法
var arr=new Array('red','green','blue');
alert(arr.valueOf()); //output red,green,blue
alert(arr.valueOf()==arr.toString()) //true
//join()方法, 控制输出的连接标点
var arr=new Array('red','green','blue');
alert(arr.join('--')); //output red--green--blue
//split("")分割字符串为数组,当分隔符为“”空,则解析每个字符
var sColors="green";
var aColors=sColors.split("");
alert(aCOlors.toString()); //g,r,e,e,n
//Array 具有concat(), slice()方法
var a, b, c, d;
a = new Array(1,2,3);
b = "JScript";
c = new Array(42, "VBScript);
d = a.concat(b, c);// 返回数组 [1, 2, 3, "JScript", 42, "VBScript"]
//slice()回顾
var s=new String('hello world');
alert(s.slice(-3)); //rld s.slice(8)
alert(s.substring(-3)); //hello world s.substring(0)
alert(s.slice(3,-4)); //lo w s.slice(3,7)
alert(s.substring(3,-4)) //hel s.substring(0,3)
//最后一个,第一步,s.substring(3,0), 而substring()
//方法会把小的数字放在前面,变成了s.substring(0,3)
Array类的栈(后进先出结构)
Code
//array提供了2个方法, push()加 , pop()删
var stack=new Array;
stack.push("red");
stack.push("green");
stack.push("blue");
alert(stack.toString()); //red,green,blue
var item=stack.pop();
alert(item); //blue
alert(stack.toString()); //red,green
//另外2个方法 shift()删除数组第一个项并返回
//unshift()把一个项放在数组的第一个位置,并把余下的后移
var sColors=["red",'green','blue'];
var vitem=sColors.shift();
alert(sColors.valueOf());//green,blue
alert(vitem);
sColors.unshift("yellow");
alert(sColors.toString());//yellow,green,blue
2.1.2 Date对象
从Date 对象中提取信息
var objDate=new Date();
objDate.getFullYear()以四位数字返回年
objDate.getYear()根据浏览器不同,以两位或者四位数字返回年
objDate.getMonth()
objDate.getDate()
objDate.getDay()
objDate.getHours()
objDate.getMilliseconds().
…………
Code
var objDate=new Date();//创建一个日期对象表示当前时间
var year=objDate.getFullYear();
var month=objDate.getMonth()+1; //getMonth返回的月份是从0开始的,因此要加1
var date=objDate.getDate();
var day=objDate.getDay();
//根据星期数的索引确定其中文表示
switch(day){
case 0:
day="星期日";
break;
case 1:
day="星期一";
break;
case 2:
day="星期二";
break;
case 3:
day="星期三";
break;
case 4:
day="星期四";
break;
case 5:
day="星期五";
break;
case 6:
day="星期六";
break;
}
document.write("今天是:"+year+"年"+month+"月"+date+"日 "+day);
2.2、内置对象
由ECMAScript实现提供的、独立于宿主环境的所有对象,在ecmascript程序开始执行时出现。
2.2.1、 global
2.2.2、 math
2.3、宿主对象
所有非本地对象都是宿主对象
知识点: 关键字this, 定义类或对象, 原型模式, 混合的构造函数/原型模式, 动态原形方法
常用的创建对象方式
//混合的构造函数原型方式(最常用)
function Car(sColor, iDoors, iMpg){
this.color=sColor;
this.doors=iDoors;
this.mpg=iMpg;
this.drivers=new Array("Mike","Sur");
}
/**//*对比单纯原型方式
function Car2(){}
Car2.prototype.dors=4;
function.pro………………
…………
Car2.prototype.drivers=new Array('may','sur');
var car11=new Car2(); var car22=new Car2();
alert(car11.drivers==car22.drivers); //true
//最大的问题,不同对象居然可以操作同一个指针
*/
Car.prototype.showColor=function(){
alert(this.color);
alert(this instanceof Car);
}
var car1=new Car("red1",4,25);
var car2=new Car("blue",3,27);
alert(car1.drivers==car2.drivers); //false
alert(car1.showColor()==car2.showColor());
2.4、实例
对比两种字符串相加处理方式的效率
用StringBuffer大大提高性能
function StringBuffer(){
this._strings=new Array;
}
StringBuffer.prototype.add=function(value){
this._strings.push(value);
}
var str="";
var date=new Date;
//for(var i=0; i<20000; i++){
// str+="test";
//}
var date2=new Date;
//alert(str.substring(0,10)+(parseInt( date2.getSeconds())-parseInt(date.getSeconds())));
var date3=new Date;
var buffer=new StringBuffer();
for(var j=0; j<220000; j++){
buffer.add("2.");
}
var date4=new Date;
alert(buffer._strings.toString().substring(0,10)+ (parseInt( date4.getSeconds())-parseInt(date3.getSeconds())));