Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 756|回复: 0

JavaScript中定义类或对象

[复制链接]

该用户从未签到

发表于 2011-10-16 18:35:05 | 显示全部楼层 |阅读模式
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

这个方法是不是比前面的都要完善呢?自己选择吧!
还有一个动态原型方法,比较难掌握,在此就不做介绍了!!
终于把定义对象总结完了!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-18 21:02 , Processed in 0.371409 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表