轻松拿下JavaScript(三)——创建对象,构造方法,成员

我们这节讲到:如何创建自己的对象,如何创建构造方法,如何创建公有、私有、特权、静态成员。

如何创建自己的对象:我们从以下三点来讲:

1、我们从最简单的例子开始:var myObject=new Object();还有一种等价的方式:var myObject={};无论从哪种方式最终的myObject变量都是Object对象的实例,他作为一个对象的存在外没有任何其他作用。

2、实例化的过程,首先通过new关键字告知JS创建一个全新对象。然后新建的实例被赋值给一个变量,以便你可以通过引用那个变量来访问对象的新实例。不过为了做到这一点所实例化的对象必须是一个构造函数。

3、每个核心对象,例如:Object、Function、Array和String都含有构造函数。

当完成对象实例化之后就不能再基于新实例使用new关键字创建例外的实例了。

var anotherObj=new myObject();

就会报错,说myObject不是构造函数:我们看一下:

<title>创建自己的对象</title>
</head>
<body>
<script type="text/javascript">
var myObject={};//new Object();
alert("");
</script>
</body>

我们现在创建了一个myObject对象,那么我们继而创建的话:

<title>创建自己的对象</title>
</head>
<body>
<script type="text/javascript">
var myObject={};//new Object();
var obj=new myObect();
alert("");
</script>
</body>

就会报错。

如何来创建构造函数:

1、Function是创建构造函数的起点。

<script type="text/javascript">
	function myConstructor(a){
	/*某些代码*/
	}
</script>

2、上面的代码等价于下面的代码:

<script type="text/javascript">
	var myConstructor=new Function('a','/*某些代码*/');
</script>

3、下面使用new的方式有性能问题所以不推荐使用。

4、Function对象的特别之处在于,它的实例也能作为构造方法,因此可以用来创建函数的新实例。所以可以编写下面的代码:

<script type="text/javascript">
	function myConstructor(a){
	/*某些代码*/
	}
	var myObject=new myConstructor();
</script>

此时,myConstructor函数可以作为构造函数。当对象被实例之后,构造函数会执行包含的代码。

<script type="text/javascript">
var myObject={};//new Object();
	function myConstructor(message){
	/*某些代码*/
	alert(message);
	this.myMessage=message;
	}
	var myObj=new myConstructor('helo world');
	alert("");
</script>

显示的结果为:

在这个例子里边:我们要记住一下2点:

1、this引用的是myObj实例,通过将message参数赋值给this.myMessage使myObj拥有一个可以随时访问的名为myMessage的属性。var message=myObj.myMessage;

2、myMessage属性只在被实例化的myConstructor的实例中可用,而再myConstructor函数自身中是无效的:

function myConstructor(message){
	this.myMessage="abc";
}
alert(myConstructor.myMessage);

若是能运行成功,应该显示的是:abc。对吧。但是结果是:


这就说明了咱们的那个结论。

添加静态方法:

<script type="text/javascript">
var myObject=new Object();
//添加一个属性
myObject.name='jh';
//添加一个方法
myObject.alertName=function(){
	alert(this.name);
}
//执行添加的办法
myObject.alertName();
</script>

打印出了jh。

在上面的代码中我们通过点运算符直接在myObject对象上将name属性和alertName()方法作为静态成员添加到了对象实例中。而此处恰恰是最容易导致误解的地方。因为这里的静态成员只存在于对象的一个个具体实例而不存在于构造函数中。

如果以Function对象为起点,也存在同样的问题,只不过这次的对象实例同时也是一个构造函数。

var myConstructor=function(){

}
myConstructor.name='jh';
myConstructor.alertName=function(){
	alert(this.name);
}
myConstructor.alertName();

这里的代码也能正常运行,因为myConstructor既是一个实例也是一个构造函数,但是name和alertName成员不能应用到任何新的实例中。如果创建myConstructor的实例,会报错如下面的代码:

<script type="text/javascript">
var myConstructor=function(){

}
myConstructor.name='jh';
myConstructor.alertName=function(){
	alert(this.name);
}
//myConstructor.alertName();
var myObj=new myConstructor();
myObj.alertName();
</script>

产生一个错误:

因为是一个静态成员。只存在于对象的一个具体实例而不存在于构造函数中。

另外讲一细节,我们平时说下面这两个写法是一样的:

var myConstructor=function(){ 

}
function myConstructor(){
	
}

但是有一个细节问题,第一种写法必须要先定义才能调用,如果我们先调用在定义,就会报错,而第二种写法不存在这个问题。

加公有方法:

1、能够使实例化的对象包含的方法称为公有方法,需要修改函数原型,即prototype属性。

2、prototype属性用来定义对象自身内部构造的特殊成员。如果将prototype修改则此修改将立即应用到其派生的对象和实例。

3、当修改一个对象的原型时,任何继承该对象的对象和已经存在的所有实例都回立即继承同样的变化。根据用法的不同这一特性既强大也可能会导致问题,因此当你修改已有的但不是你的对象的原型时要特别小心。

<script type="text/javascript">
function myConstructor(){
	//某些代码
	this.myMessage="abc";
}
var myObj=new myConstructor();
alert(myObj.myMessage);
myConstructor.prototype.myName='jh';
alert(myObj.myName);
</script>

这就打印出来了abc和jh。

要添加公有方法只需要使用点操作符向它的原型添加方法即可:


添加私有和特权成员:

私有成员就是在构造函数中定义的变量和函数。

例如向myConstructor上添加私有方法和属性只需要:


特权方法:

与私有方法不同,特权方法能够被公开访问,而且还能访问私有成员。特权方法是指在构造函数的作用域中使用this关键字定义的方法:


通过上面的方式myConstructor拥有了和前面使用prototype相同的appendToMessage()方法,但是此时的方法隶属于构造函数的作用域中可以访问私有成员。

公有、私有、特权、静态总结:

1、私有和特权成员在函数的内部,他们会被带到函数的每一个实例中,因而将占用大量的内存。

2、公有的原型成员是对象的蓝图的一部分,适用于通过new关键字实例化该对象的每一个实例。

3、静态成员只适用于对象的一个特殊实例。




  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
《Java程序设计》课程实验指导书程序代码(答案)(实验),个人原创,仅供参考与交流。 希望多多交流,共同进步! 实验 类和对象 一、实验目的: 掌握Java类的结构、类的定义、方法和属性的定义以及对象的实现; 掌握类及其成员修饰符的使用;掌握构造函数的使用;方法的参数传递和返回值的用法; 掌握类变量与实例变量,以及类方法与实例方法的区别。 、实验内容: 1.定义一个学生类(Student),属性有private的名字(name), public的年龄(age),专业(specialty)和封装name属性的方法:setName(),getName(),getspecialty()编写Application,创建一个学生对象,设置name和age属性值,然后调用一个方法(此方法将对象作为参数传递,在方法中打印出学生的名字name和年龄age)。(学生类仅包含静态成员变量和方法。) 2.定义一个类Point,代表一个点,public属性有x和y,方法有显示点坐标 show(),构造函数有两个参数分别给x,y赋值,在main方法中构造两个对象,再创建一方法(getMiddle)为取两个点构成线段的中点的坐标,参数为2个点对象,调用此方法后得到一个新的点,编写Application,显示该对象的坐标值。 3.定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Complex C1,Complex C2) 求两个复数的差的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex subComp(Complex C1,Complex C2) 求两个复数的乘积的方法:(参数是两个复数类对象,返回值是复数类对象,新复数实部=两复数实部乘积-两复数虚部乘积,新复数虚部=两复数实部与虚部交叉乘积之和,)public Complex multiComp(Complex C1,Complex C2) 比较两个复数是否相等的方法(参数是两个复数类对象,返回值是boolean类型)public boolean equalComp(Complex C1,Complex C2) 在Application中测试该类的方法,实部x和虚部y可由main方法参数提供输入。 、实验要求: 1. 正确地定义类、方法和属性; 2. 学会方法的参数传递和返回值的用法; 3. 熟练使用类及其成员修饰符 4.使用构造函数创建类的对象; 5. 类变量与实例变量,以及类方法与实例方法的使用 6.程序应包括各个被调用方法的执行结果的显示。 7.写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提示,并给出解决办法。(附运行界面、源代码)。 四、实验步骤: 1.(第1题)定义一个学生类(Student)及它的属性和方法;定义主类和main(),在main()方法中创建学生对象,并通过对象调用它的方法setName(),getName(),输出学生的名字name和年龄age。 2. (第2题) 定义类Point及它的属性、方法和构造函数,定义主类和main(),在main()方法中创建两个坐标对象,,并通过对象调用getMiddle方法后得到一个新的点坐标,调用show()显示该对象的坐标值。 3. (第3题)定义一个复数(z=x+iy)类Complex,及它的属性、方法和构造函数;定义主类和main()方法,在main()方法中创建两个复数类Complex对象,并通过复数类对象调用它们的属性和方法,输出方法执行结果。 五、自做实验 1. 构造一个类来描述屏幕上的一个点,该类的构成包括点的x和y两个坐标,以及一些对点进行的操作,包括:取得点的坐标值,对点的坐标进行赋值,编写应用程序生成该类的对象并对其进行操作。 2. 编写实现:有一个角形类Triangle,成员变量有底边x和另一条边y,和两边的夹角a(0<a<180),a为静态成员成员方法有两个:求面积s(无参数)和修改角度(参数为角度)。 3. 编写实现: 构造函数为 Triangle(int xx,int yy,int aa) 参数分别为x,y,a赋值 在main方法中构造两个对象,求出其面积,然后使用修改角度的方法,修改两边的夹角,再求出面积值。(提示:求高的方法 h=y*Math.sin(a) ) 注意:构造方法用于对成员变量初始化,无参数的构造方法成员变量初始化为0值。
《Java程序设计》课程实验指导书程序代码(答案)(实验五:Java的异常处理),个人原创,仅供参考与交流。 希望多多交流,共同进步! 实验五 Java的异常处理 一、实验目的: 理解 java 语言中独特的异常处理机制; 掌握异常处理方法; 正确地使用捕获异常和声明抛弃异常的两种异常处理的方法; 了解自定义异常类的使用; 理解抛出异常和声明抛出异常的区别与联系; 二、实验内容: 1. 从命令行得到5个整数,放入一整型数组,然后打印输出,要求:如果输入数据不为整数,要捕获Integer.parseInt()产生的异常,显示“请输入整数”,捕获输入参数不足5个的异常(数组越界),显示“请输入至少5个整数”。 2.写一个方法void sanjiao(int a,int b,int c),判断个参数是否能构成一个角形,如果不能则抛出异常IllegalArgumentException,显示异常信息a,b,c+”不能构成角形”,如果可以构成则显示角形个边长,在主方法中得到命令行输入的个整数,调用此方法,并捕获异常。 3.自定义类Sanj,其中有成员 x,y,z,作为边长,构造方法Sanj(a,b,c)分别给x,y,z赋值,方法求面积getArea和显示角形信息(个边长)showInfo,这2个方法中当条边不能构成一个角形时要抛出自定义异常NotSanjiaoException,否则显示正确信息。在另外一个类中的主方法中构造一个Sanj对象(边为命令行输入的个整数),显示角形信息和面积,要求捕获异常。 、实验要求: 1. 通过实验掌握捕获异常和声明抛弃异常的两种异常处理的方法; 2. 程序必须能够捕获Integer.parseInt()产生的异常并作相应的处理; 3. 程序必须能够将处理的相应的信息输出出来; 4. 写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提材示,并给出解决办法。(附运行界面、源代码)。 四、实验步骤: 1. (第1题) 使用try…..catch…. finally语句对Integer.parseInt()产生的异常进行捕获处理; 2. (第2题) 定义方法void sanjiao(int a,int b,int c)中,不符合条件则抛出异常(if a+b<=c(或a+c<=b,b+c<=a) then throw new IllegalArgumentException(),),再定义main方法,调用此方法,用try…..catch…. finally语句并捕获异常; 3. (第3题) 定义角形类及相应的方法, 在定义的方法中对不符合条件则抛出异常(如上题) ,再定义main方法,对正确的数据输出正确信息,否则捕获异常; 五、自做实验 1.参考下面的程序,试修改程序,捕获相关异常,使得程序能正常运行。[提示:用错误数据测试,即可得到异常类名,运行时主方法参数输入 abc 测试] public class StringIndexOutOf{ public static void main(String args[]){ System.out.println("字符串索引越界异常"); String str=args[0]; System.out.println(“第四个字符为 ”+str.charAt(3)); int aa=Integer.parseInt(args[0]); System.out.println(“平方为 ”+aa*aa); } }
《Java程序设计》课程实验指导书程序代码(答案)(实验二),个人原创,仅供参考与交流。 希望多多交流,共同进步! 实验二 Java语言基础 一、实验目的: 熟悉Java基本语法,基本数据类型,各种运算符及表达式的使用,掌握运算符优先级,熟悉使用Java的选择语句,循环语句。 二、实验内容: 1.编写Java Application程序,输出1900年到2000年之间的所有润年。(闰年的判断条件:能被4整除且不能被100整除,或能被400整除); 2.编写Java Appet 程序打印 “水仙花” 数 (它的个、十、百位数字的立方的和等于该数本身,如:153=1^3+5^3+3^3) 3. 编写Java Application程序,分别用do-while和for循环计算1+1/2!+1/3!+1/4!...的前20项和 、实验要求: 1. 正确使用Java语言的选择语句,循环语句; 2. 调试程序、编译,运行后得到正确的结果 3.写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提成示,并给出解决办法。 四、实验步骤: 1.编写主类; 2.在static public void main(String[ ] args)方法中加入实现要求功能的代码,主要步骤如下: (第一题)从1900到2000循环,按照闰年的判断条件是则输出1900年到2000年之间的所有润年。 (第二题)编写Java Applet, 在public void paint(Graphics g)方法中加入实现要求功能的代码, 主要步骤是:从100到1000循环,判断每个数是否符合水仙花数的特点,是则输出之。 3.编译运行程序,观察输出结果是否正确。 五、自做实验 1. 输出100以内的所有素数。 提示: 逐个判断小于a的每个正整数x,第二重循环针对x,判断其是否是质数。 2.将所输入之正整数,以二、八、十六进制表示出来。 提示: 可写个方法分别计算输出二、八、十六进制表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值