JavaScript 2 对象编程

JavaScript是一种基于对象(object)的编程,可以使用三类对象,即内置对象,浏览器对象(或宿主对象)和自定义对象。内置对象和浏览器对象合称预定义对象。

1. 内置对象

指JavaScript语言提供的对象,包括Math、Date、String、Array、Number、Boolean、Function、Global、Object、RegExp和Error等实现一些常用功能的对象。

①Object对象:

属性/方法说明
prototype该属性指定对象类型原型的引用
constructor该属性表示创建对象的构造函数
toString()该方法返回对象的字符串表示
valueOf()该方法返回对象的值
hasOwnProperty(proName)该方法返回一个布尔值,指出一个对象是否含有指定名称的属性
propertyIsEnumerable(proName)该方法返回一个布尔值,判断指定属性是否可列举。一般而言,自定义属性可列举,而预定义属性不可列举

Object对象是一种特殊的内置对象,Object对象的主要用途是为所有JavaScript对象提供通用功能。JavaScript的所有对象都是Object对象的示例(可以说Object是所有对象的基类),因此任何对象都可以使用Object对象的属性和方法。通常其他对象都会重新定义Object对象的方法(如toString()、valueOf等方法)。

②Function对象
在JavaScript中,任何函数都是Function对象。定义函数的方式有两种,一种是常用的普通格式,即使用function关键字隐式创建Function对象;另一种是使用new关键字显示创建Function对象。
(1)显示创建Function对象
var fun_name=new Function(arg1,arg2,…,argN,function_body);
每个参数都是字符串,前N个表示函数的参数名,最后一个是函数体代码,而fun_name是函数对象变量名。

			var test_function=new Function('msg','document.write(msg);');//创建Function对象
			document.write("变量test_function所引用的函数对象表示一个函数定义:<br>");
			document.write("<pre>"+test_function.toString()+"</pre><br>");
			test_function("通过变量test_function调用函数<br>");
			var f1=test_function;
			f1("通过变量f1调用函数<br>");
			var f2=f1;
			f2("通过变量f2调用函数<br>");

(2)隐式创建Function对象
定义函数的普通格式使用function关键字,当使用该关键字时就隐式创建了Function对象。

function test_function(msg) {
	document.write(msg);
}

(3)无名函数

var test_function=function (msg) {//定义一个无名函数,也隐式创建了一个Function对象
	document.write(msg);
};//分号“;”表示这条赋值语句的结束标记

③Array对象:
如果数组中所有数组元素的值都是基本类型的值,为一位数组;

			var arr=new Array();
			arr[0]=3;
			arr[1]=2;
			console.log(arr);
			for(i in arr){
				console.log(arr[i]);
			}

如果数组中所有数组元素的值又都是数组时,则为二维数组:

			var students=new Array();
			students[0]=new Array("小一",96,95);
			students[1]=new Array("小二",93,90);
			students[2]=new Array("小三",86,100);
			students[3]=new Array("小四",99,100);
			for(i=0;i<students.length;i++){
				for(j=0;j<students[i].length;j++){
					document.write(students[i][j]+"\t");
				}
				document.write("<br>");
			}

2. 浏览器对象

浏览器根据系统配置和所装载的页面为JavaScript程序提供的对象,如window、document等对象。


3. 自定义对象

程序员根据需要而定义的非预定义类型的对象。

①定义对象:
在JavaScript中,定义对象的简单方法是通过创建Object对象定义新型的对象,先创建Object对象,再为该对象添加新型对象的属性和方法。

			var person=new Object();//用于定义一个Person对象
			person.name="张三";
			person.gender="男";
			
/*			//字面量对象
			var person={
				name="张三",
				gender="男";
			}*/
			
			document.write(person.name+"是"+person.gender+"人<br>");
			document.write("person对象有以下可以列举的属性:<br>")
			for( var proName in person ){
				document.write(proName+":"+person[proName]+"<br>");
			}

字面量对象是指在程序代码中直接书写的对象,其格式为一对大括号"{}"括起一个或多个用逗号分隔得属性声明,而每个属性声明写成“属性名:属性值”对。从字面量对象形式可知,对象相当于一组属性名至属性值得映射。
除点标记格式之外,访问对象属性也可以使用格式“对象名[属性名]”,如person[‘name’],访问了person对象的name属性。

②定义属性:
一个JavaScript对象,除了包含已预定义的属性之外,也可以自定义属性;方法是直接为对象的新属性赋值,对象的自定义属性与其他属性的使用方法基本相同,不同之处在于,可以使用delete运算符删除对象的自定义属性

 obj.new_attr=some_value;///为对象obj添加新属性new_attr

 delete obj.new_attr;//删除对象obj的自定义属性new_attr

为Date对象定义新属性和删除

			var d=new Date(1949,9,1);
			document.write("赋值前:d.hasOwnProperty('events')="+d.hasOwnProperty('events')+"<br>");
			d.events="中华人民共和国宣布成立!";//定义新属性;
			document.write("赋值后:d.hasOwnProperty('events')="+d.hasOwnProperty('events')+"<br>");
			document.write(d.toLocaleDateString()+d.events+"<br>");
			if(delete d.events){
				document.write("已删除对象d的自定义属性events"+"<br>");
			}
			document.write(d.toLocaleDateString()+d.events+"<br>");
			if(!delete Math.E){
				document.write("不能删除预定义对象Math的内置属性E"+"<br>");
			}
			document.write("delete后:Math.E="+Math.E+"<br>");

delete是单目运算符,若删除成功,返回true,删除失败,返回false。delete语句可以删除对象的自定义属性,但不能删除预定义对象的固有属性。
类似未赋值的变量,若读取对象不存在的属性,则返回undefined;

③定义方法
由于函数是Function对象,所以定义对象的新方法就是将一个函数对象赋值给对象的新属性。

obj.new_method=fun_obj;//为对象obj定义新方法new_method

			var person=new Object();//用于定义一个Person对象
			person.name="张三";//定义属性name
			person.gender="男";//定义属性gender
			person.sayHi=function(msg){//定义方法sayHi(msg);
				document.write(msg);
			}
			document.write(person.name+"说:");
			person.sayHi("您好!");//调用自定义方法sayHi(msg)

④定义对象类

在JavaScript中定义对象的标准方法是定义对象类,而定义对象类,则必须有构造方法。(前面定义的Person对象其实仍然是Object对象类的实例对象)
(1)构造函数:
构造函数是定义对象如何创建的函数,构造函数内部一般不使用return语句,并且通常要使用this关键字引用新创建的对象。

			function Person(name,gender){//类Person的构造函数
				this.name=name;//定义属性name
				this.gender=gender;//定义属性gender
				this.introduceSelf=function(){//定义方法introduceSelf()
					document.write("我叫"+this.name+","+this.gender+"<br>");
				}
			}
			
			var p1=new Person("张三","男");//实例化第一个Person对象
			var p2=new Person("李晓晓","女");//实例化第二个Person对象
			
			p1.introduceSelf();
			p2.introduceSelf();

关键字this,表示引用当前对象
构造函数的调用必须使用new 关键字
在JavaScript中,类就是构造函数,而类名就是构造函数名。由于构造函数也是Function对象,因此每个JavaScript类也是对象,称为类对象。

			document.write("Person对象的构造函数代码如下:<br>");
			document.write("<pre>"+p1.constructor.toString()+"</pre>");//显示自定义对象的构造函数代码
			document.write("Date对象的构造函数代码如下:<br>");
			var d=new Date();
			document.write("<pre>"+d.constructor.toString()+"</pre>");//显示预定义对象的构造函数代码

在这里插入图片描述
任何对象都有constructor属性,而函数对象的toString()方法将返回函数代码,但预定义对象(Date,String等)的toString()方法不会返回构造函数的内部代码。

(2)instanceof运算符
用于判断对象是否是指定类的一个实例,是,返回true,否,返回false;
object instanceof class

			if(p1 instanceof Person){
				document.write("变量p1引用的对象是Person对象类的实例<br>");
			}else{
				document.write("变量p1引用的对象不是Person对象类的实例<br>");
			}
			if(d instanceof Person){
				document.write("变量d引用的对象是Person对象类的实例<br>");
			}else{
				document.write("变量d引用的对象不是Person对象类的实例<br>");
			}
			if(d instanceof Date){
				document.write("变量d引用的对象是Date对象类的实例<br>");
			}else{
				document.write("变量d引用的对象不是Date对象类的实例<br>");
			}

(3)类对象的prototype属性
类对象(即构造函数)的prototype属性是对一个对象的引用,该对象称为类实例对象的原型对象。默认,原型对象是一个Object对象。主要用途是为类的实例对象添加提供共享的方法和属性。
通过实例对象可以访问的属性和方法分为两类:一类是实例对象自定义的属性和方法,另一类来自原型对象的属性和方法(或称原型属性和原型方法)。
自定义的属性和方法优先级高于原型对象的属性和方法。

			function Person(name,gender){//类Person的构造函数
				this.name=name;//定义属性name
				this.gender=gender;//定义属性gender
			}
			Person.prototype.introduceSelf=function(){//定义共享方法introduceSelf()
					document.write("我叫"+this.name+","+this.gender+"<br>");
					//this关键字是对实例对象的引用,而不是对原型对象的引用
				}
			var p1=new Person("张三","男");//实例化第一个Person对象
			var p2=new Person("李晓晓","女");//实例化第二个Person对象
			
			p1.introduceSelf();
			p2.introduceSelf();

(4)继承(原型链)
JavaScript也被称为基于原型(prototype)的语言,其原因在于JavaScript语言的继承机制是通过原型链来实现。
定义子类:
在JavaScript中,为子类指定父类的方法是将父类的实例对象赋值给子类的prototype属性
A.prototype=new B(…) //A为子类,B为父类

			function Person(name,gender){//类Person的构造函数
				this.name=name;//定义属性name
				this.gender=gender;//定义属性gender
			}
			Person.prototype.introduceSelf=function(){//定义共享方法introduceSelf()
					document.write("我叫"+this.name+","+this.gender+"<br>");
			}
			
			function Student(name,gender,grade){
				Person.call(this,name,gender);//在子类中重新定义父类中的属性
				this.grade=grade;//定义属性grade
			}
			Student.prototype=new Person();//将类Person定义为类Student的父类
			var s=new Student("张三","男",80);//创建Student对象
			s.introduceSelf();//调用继承的方法
			Student.prototype.introduceSelf=function(){//重写父类方法
				document.write("我叫"+this.name+","+this.gender+","+this.grade+"分<br>");
			}
			s.introduceSelf();//调用重写方法
			if(s instanceof Person){
				document.write(s.name+"是Person<br>");
			}
			if(s instanceof Student){
				document.write(s.name+"是Student");
			}

call(thisObj,arg1,arg2…argN)是Function对象的方法,第一个参数是一个对象引用,而其他参数为函数的常规参数。


对象删除
JavaScript具有无用对象的自动回收功能,即当一个对象没有被任何变量引用时,该对象将被自动删除。因此,删除对象的方法是将该引用对象的所有变量赋值为null。例如:
引用变量=null ; //null是空引用常量值

一个引用变量超出其作用范围时,JavaScript会自动将该变量赋值为null;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值