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;