|
javaScript真的非常灵活,灵活的同时意味着什么?--难以掌握。因为它的灵活,使它的用法五花八门,它的效果更令人不可思议。好好学习......
怎样在JavaScript中创建对象呢?
JavaScript和java创建对象的方法还是有很大差别的,在java中就是先定义一个类,在类里面封装对象的所有属性和方法。通过new 类名();创建对象的,此时的对象就具有类里面封装的所有属性和方法。而在JavaScript中就不是这样的,JavaScript中没有实际存在的类,对象是无序特性的集合,对象的定义就是对象本身,对对象的定义其实就是在定义一个类。
而定义对象的方法是从少到多,这些方法也是越来越趋于完善的。看看哪种最适合你呢?
1.工厂方法。这是最原始的方法。
举个简单的例子就知道什么是工厂方法了
function Car(){
var oCar = new Object();
oCar.color = "black";
oCar.name = "Audi";
oCar.value = "36w";
oCar.showColor = function(){
alert(this.color);
}
return oCar;
}
var oCar1 = Car();
var oCar2 = Car();
上面的例子是通过构造了一个函数定义对象的,在函数里面生明了一个对象,并且,增添了对象的属性和方法,最后用return将创建的对象作为返回值。
这样创建对象的方法,很有局限性,这样创建出来的对象是一模一样的。
为什么叫工厂方法呢?我也不太清楚,我感觉工厂是用来批量生产东西,而且这些东西都是一样的。用这样的方法创建的对象也都是毫无差别的,所以叫工厂方法吧!!
大家都发现了这样的问题,创建的对象都是一样的,这就很不方便了,我想要一辆白色的奥迪,还要重新去建一个工厂,这就有点得不偿失了!因此有对工厂函数做了修改,使其更完善。
还是上面的例子,不过有些不一样!
function CreateCar (color,name,value){
var oCar = new Object();
oCar.color = colorl;
oCar.name = name;
oCar.value = value;
oCar.showColor = function(){
alert(this.color);
}
return oCar;
}
var oCar1 = CreateCar("whilt","BMW","140w");
var oCar2 = CreateCar("black","Ben","120w");
这样创建的对象,就完善了不少,我们想要什么的汽车都可以。
将函数的参数作为对象属性的默认值。
有些开发者感觉这样创建对象还是有不妥的地方,于是又改进了。
你看,设个shouColor方法,每次创建对象的时候,是不是都要同时创建这个方法呢!其实它们都在共享着一个方法,而每个对象都创建一个就显得有些浪费了。于是想到了,在工厂函数外面定义函数属性,在函数里面定义一个指向该方法的指针,不就实现共享了吗?函数本身就是对象,而对象是一种引用类型,所以方法名本身就是地址。现在理解指针了吧!看看代码吧!
function showColor(){
alert(this.color);
}
function CreateCar (color,name,value){
var oCar = new Object();
oCar.color = colorl;
oCar.name = name;
oCar.value = value;
oCar.showColor = showColor;
return oCar;
}
var oCar1 = CreateCar("whilt","BMW","140w");
var oCar2 = CreateCar("black","Ben","120w");
oCar1.showColor();//output whilt
oCar2.showColor();//output black
这样定义对象,再创建对象,对代码的重用性就大大提高,效率可想而知!
2.构造函数的方式
这种方式和工厂方法几乎是一样,不过就是在方法里面没有定义对象,创建起来还简单点。代码说明一切!!
function CreateCar(color,name,value){
this.color = color;
this.name = name;
this.value = value;
this.showColor = function (){
alert(this.color);//当然也可以像工厂方法一样在函数外面定义对象的函数属性!!如果不能的话,岂不是倒退的了!
}
}
这种方式看起来简单对了,函数里面没有首先定义一个对象,而是用this取而代之。
现在来创建一个对象
var oCar1 = new CreateCar("black","Ben","120w");
使用new访问CreateCar()函数的第一行代码的时候先创建一个对象,该对象只能this才可以反问。然后赋予this属性,将this作为函数的方法的返回值,这样就创建了一个对象~~
可是这样做没有体现到多大的优势,只是少些了一点点代码。因此第三种方法又出现了。
3.原型方式
原型,什么是原型呢?为什么叫它原型方式呢?
使用原型方式定义对象实际上是使用了对象的prototype属性。
首先定义一个空的函数,然后在函数外面将属性和方法赋予这个对象的prototype属性,prototype属性其实就是原始属性!人,就应该有鼻子有眼,不能生出来的人没有眼,然后再自己长鼻子,长眼睛!将属性和方法赋予prototype属性将更加人性化!看例子吧!O(∩_∩0~
function Car(){
}
Car.prototype.color = "black";
Car.prototype.name = "Ben";
Car.prototype.drivers = ["you","me"];
Car.prototype.showColor = function(){
alert(this.color);
}
var oCar = new Car();
到此为止,一个对象创建成功了,你看到了,从头到尾我们并没有赋予oCarzhege对象任何属性和方法。
alert(oCar.name);结果会是什么呢?如大家所期望的一样,是”Ben”
在这里Car就好比就是一个类,对他的原始属性赋值就可以影响到他的对象。和人一样,一个人类,生出来就有鼻子有眼睛!这就是人类!
可是这中创建对象的方法,你也看到了,在函数中并没有参数,更别想将参数作为原始属性的默认值了,想赋予自己理想的值需要自己在后期改。
还有一个弊端。你们看,drivers这个属性,它是指向数组的一个指针,是一种引用类型,他操纵的是原始值,原始值一变,所有创建的对象就会都改变。
看代码!
var car1 =new Car();
var car2 = new Car();
car1.drivers.push("he");
alert(car2.drivers);
结果是什么?是 you,me,he
这就太不像话了,一个人变异后长了翅膀,所有的人都会长翅膀,这就太离谱了!没有否认这种方法,这种方法的思想非常好,于是第四种方法诞生了!
4.原型方法和构造函数混合法
用构造函数的方法定义非函数属性,用原型方式定义函数属性!这就完善多了,这个方法也是当今很流行的方法!!!
不多说了,看代码!
function Car(color,name,value){
this.color = color;
this.name = name;
this.value = value;
this.drivers = ["you","me"];
}
Car.prototype.showColor = function(){
alert(this.color);
}
var car1 = new Car("balck","Ben","120W");
var car2 = new Car("whilt","BMW","140W");
car1.driver.push("he");
alert(car1.driver);//output you,me,he
alert(car2.driver);//output you,me
这个方法是不是比前面的都要完善呢?自己选择吧!
还有一个动态原型方法,比较难掌握,在此就不做介绍了!!
终于把定义对象总结完了!!! |
|