JS 创建对象
functionPCar(){
}
PCar.prototype.color="blue";
varpcar1=newPCar();
/*
调用newCar()时,原型的所有属性都被立即赋予要创建的对象,意味着所有的PCar实例存放的是指向
showColor()函数的指针,从语义看起来都属于一个对象,因此解决了前面两种方式存在的问题。此外使用
该方法,还能使用instanceof运算符检查给定变量指向的对象类型。因此下面的代码将输出true:
*/
alert(pcar1instanceofPCar);//output"true"
/*
这个方法看起来不错,遗憾的是,它并不尽人意。
1.首先这个构造函数没有参数。使用原型方式时,不能给构造函数传递参数初始化属性值,因为pcar1和
pcar2的属性都等于"blue"
2.真正的问题出现在属性指向的对象,而不是函数时,函数共享不会造成任何问题,但是对象却是很少被多个
实例共享的。
*/
//2.混合的构造函数/原型方式(推荐)
/*
联合使用构造函数和原型方式,就可像使用其他程序设计语言一样创建对象,这种概念非常简单,即用构造函数
定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。
*/
functionhCar(sColor){
this.color=sColor;
this.drivers=newArray('Mike','Sue');
}
hCar.prototype.showColor=function(){
alert(this.color);
}
varhcar1=newhCar('ycolor');
varhcar2=newhCar('rcolor');
hcar1.drivers.push('Matt');
alert(hcar1.drivers);//output"Mike,Sue,Matt"
alert(hcar2.drivers);//output"Mike,Sue"
//3.动态原型方式(推荐)
/*
对于习惯使用其他开发语言的开发者来说,使用混合构造函数/原型方式感觉不那么和谐。批评构造函数/原型方式的人
认为,在构造函数内找属性,在外部找方法的做法不合理。所以他们设计了动态原型方式,以供更友好的编码风格。
动态原型方式的基本想法与混合构造函数/原型方式相同,即在构造函数内定义非函数的属性,而函数的属性则利用
原型属性定义。唯一的区别是赋予对象方法的位置。下面是使用动态原型方法重写的Car类:
*/
functionDCar(sColor){
this.color=sColor;
this.drivers=newArray('Mike','Sue');
if(typeofDCar._initialized=='undefined'){
DCar.prototype.showColor=function(){
alert(this.color);
}
}
DCar._initialized=true;
}
vardcar1=newDCar('ydcar');
vardcar2=newDCar('bdcar');
dcar1.showColor();
dcar2.showColor();
alert(DCar._initialized);//output"true"
alert(dcar1._initialized);//output"undefined"
//4、对象直接量、new创建
创建对象最简单的方法是你的javascript代码中包含对象直接量,也可以通过运算符new创建。
varempty={};//Anobjectwithnoproperties
varpoint={x:0,y:0};
varcircle={x:point.x,y:point.y+1,radius:2};
varhomer={
"name":"HomerSimpson",
"age":34,
"married":true,
"occupation":"plantoperator",
'email':[email protected]
};
vara=newArray();//Createanemptyarray
vard=newDate();//Createanobjectrepresentingthecurrentdateandtime
varr=newRegExp("javascript","i");//Createapattern-matchingobject
创建对象后,我们可以通过"."运算符,在对象中创建新属性、引用已有属性、设置属性值等。
varbook=newObject(); //创建对象
book.title="JavaScript:TheDefinitiveGuide";
book.chapter1=newObject();//作为对象属性的,嵌套对象
book.chapter1.title="IntroductiontoJavaScript";
book.chapter1.pages=11;
book.chapter2={title:"LexicalStructure",pages:6};
alert("Outline:"+book.title+"\n\t"+
"Chapter1"+book.chapter1.title+"\n\t"+
"Chapter2"+book.chapter2.title);//从对象中读取一些属性.
在上例中,需注意,可以通过把一个值赋给对象的一个新属性来创建它.
在JavaScript语句中提到过用for/in语句可以遍历对象的属性和方法。