《JavaScript高级程序设计》笔记之'对象基础'
1.对象分类
对象类型有三种:本地对象、内置对象和宿主对象。
(1)本地对象
主要包括:Object,Function,Array,String,Boolean,Number,Date,RegExp,Error等。举例:
Array类
定义方法:
<1> var aVaulues=new Array(20);
<2> var aColors=new Array();
aColors[0]="red";
aColors[1]="blue";
aColors[2]="green";
<3> var aColors=new Array("red","blue","green");
<4> var aColors=["red","blue","green"];
属性:
length,方法:toString(),valueOf(),join(),slice(),push(),pop(),shift(),unshift(),splice().
<1> toString()
var aColors=["red","blue","green"];
alert(aColors.toString()); //outputs "red,blue,green"
alert(aColors.valueOf()); //outputs "red,blue,green"
如需逐个字符解析字符串,可以这样:
var sColor="green";
var aColor=sColor.split(""); //***
alert(aColor.toString()); //outputs "g,r,e,e,n"
<2> join()
var aColors=["red","blue","green"];
alert(aColors.join("")); //outputs "redbluegreen"
alert(aColors.join(",")); //outputs "red,blue,green"
alert(aColors.join("-spring-")); //outputs "red-spring-blue-spring-green"
<3> slice()
var aColors=["red","blue","green"];
alert(aColors.slice(0,2)); //outputs "red,blue"
<4> push(),pop()操作字符串尾部
var stack =new Array;
stack.push("red");
stack.push("blue","green"); //可以有多个参数 //***
alert(stack.toString()); //outputs "red,blue,green"
var vItem=stack.pop(); //删除栈顶,并且返回值//***
alert(vItem);
alert(stack.toString()); //outputs "blue,green"
<5> shift()和unshift()操作字符串头部
var queue=["red","blue","green"];
queue.push("yellow");
queue.shift();
alert(queue.toString()); //outputs "blue,green,yellow"
<6>splice()
var arr=["red","blue","green"];
arr.splice(0,2); //删除,从第0个位置开始的2字符
arr.splice(1,0,"yellow","black"); //插入,(替换而不删除)第2个位置字符,如:
alert(arr); //outputs "red,yellow,black,blue,green"
arr.splice(2,1,"yellow","black"); //替换并删除第2个位置字符
(2)内置对象
内置对象为本地对象子集,ECMAScript定义了两个内置对象,即Global和Math.
<1>Global对象
Glbal对象属性有:undefined,NaN,Inifinity等,方法有:isNaN(),isFinite(),paseInt()等等.
encodeURI(),encodeURIComponent(),decodeURI()...
有效的URI不能包含某些字符,如空格。所以要编码,如:
var sUri="http://www.wrox.com/illegal value.htm#start";
alert(encodeURI(sUri));
alert(encodeURIComponent(sUri));
//相对BOM的escape()和unescape()方法,URI方法更可取,因为它们会对所有Unicode符号编码,BOM方法只
对ASCII符号正确编码。
<2>Math对象
var iMax=Math.max(2,33,22,9);
alert(iMax);
alert(Math.floor(25.5)); //outputs "25"
alert(Math.ceil(25.5)); //outputs "26"
1~10的随机数:
var iNum=Math.floor(Math.random()*10+1);//其中"10"指总个数,"1"指从1开始。
2~10的随机数:
var iNum=Math.floor(Math.random()*9+2);
举例:随机选出不同颜色 //***
function selectFrom(iFirstValue, iLastValue) {
var iChoices = iLastValue - iFirstValue + 1;
return Math.floor(Math.random() * iChoices + iFirstValue);
}
var aColors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var sColor = aColors[selectFrom(0, aColors.length-1)];
alert(sColor);
(3)宿主对象
由宿主环境提供的对象,如BOM,DOM的所有对象。
2.定义对象
创建类的最好方式是用构造函数方式定义属性,用原型方式定义方法(为避免每次调用构造函数都要创建其内的方法)。
混合(工厂/原型)模式:
为了避免在工厂模式下每次调用构造函数都要创建其内的方法,所以采用此模式,让方法单独用原型方式定义。如:
function Car(sColor, iDoors, iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike", "Sue");
}
Car.prototype.showColor = function () {
alert(this.color);
};
var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
oCar1.drivers.push("Matt");
alert(oCar1.drivers); //outputs "Mike,Sue,Matt"
alert(oCar2.drivers); //outputs "Mike,Sue"
3.修改对象
这部分相当有趣!可以用prototype属性为任何已有对象创建新方法!如:
Array.prototype.enqueue=function(vItem)//也可以用同样的办法重定义已有方法 //***
{
this.push(vItem);
}
也可以为所有本地对象添加新方法,须在Object对象的prototype属性上定义它。如:
Object.prototype.showValue=function()
{
alert(this.valueOf());
}
var str="hello";
alert(str.showValue()); //outputs "hello"