ECMAScript没有正式的类,但它把对象的定义描述为对象的配方。
也就是把对象的定义放在一个函数(构造函数),这里的构造函数也不是什么特别的函数,只是用于创建对象的常规函数而已。
---------------------------------------------------------------------------------------------------
ECMAScript支持面向对象的所有要求,这里包括:
1.封装----把相关信息存储在对象中的能力
2.聚集----吧一个对象存储在另一个对象的能力
3.继承----由另一个类的来的属性和方法的能力
4.多态----编写能以多种方法运行的函数或方法的能力
---------------------------------------------------------------------------------------------------
在ECMAScript中,对象由特性(attribute)构成,特性又分为两种:属性(property)和方法(method)
---------------------------------------------------------------------------------------------------
在ECMAScript中,对象的声明和实例化,还有对象引用的概念都类似于C#
ECMAScript有自己的一套无用存储单元收集程序,和CLR的垃圾自动回收机制差不多,也可以通过显式的方式去执行回收,如:
var oObject = new Object();
oObject = null;
当下一次执行无用存储单元收集程序是,该object对象的内存空间将被回收
注:每次用完一个对象后,显式的来回收改对象的内存空间是个好习惯
---------------------------------------------------------------------------------------------------
【绑定】就是把对象的接口与对象实例结合在一起的方法
早绑定和晚绑定:
【早绑定】指在实例化对象之前定义她的特性和方法,这样编译器或解释程序就能提前将其转换为机器代码。
【晚绑定】指的是编译器或解释程序在运行前,不知道对象的类型。
//使用晚绑定无须检查对象的类型,只需要检查对象是否支持特性和方法即可,ECMAScript中的所有变量都采用晚绑定方法。
---------------------------------------------------------------------------------------------------
对象类型:
1.【本地对象】:独立于宿主环境的ECMAScript实现提供的对象,就是ECMA-262定义的类:
Object Function Array String Boolean Number date RegExp
Error EvalError RangeError ReforenceError SyntaxError TypeError URIError
2.【内置对象】:由ECMAScript实现提供的,独立于宿主环境的所有对象,在ECMAScript程序开始时出现。
ECMA-262定义了两个宿主对象:Global和Math对象
3.【宿主对象】:即由ECMAScript实现的宿主环境提供的,BOM和DOM对象都是宿主对象。
---------------------------------------------------------------------------------------------------
【Array】类:
Array类具有动态的大小,对于原始类型,Array类将其直接存储在数组空间中,对于引用类型,Array类将其的句柄存入数组空间中。
声明方式:var aColors = new Array("red","green","blue");
var aColors = ["red","green","blue"];
Array类型具有length属性,可以得到Array中存放元素的总数。
注意有中情况:
var aColors = new Array("red","yellow","green");
alert(aColors.Length) ; //outputs : 3
aColors[25] = "blue" ;
alert(aColors.Length); //outputs : 26
这里由于要在aColors数组的第25个空间上存数据,而第3到24的空间都是空的,所以编译器会为这些空的上附上null类型,所以这里的数组的元素个数就有26个了
Array类部分方法:
1.toString() 和 valueOf()方法都是现将数组中的元素转换为string类型,然后在用“,”链接,逐个输出
2.join()方法,可以指定输出元素的分隔符
3.split()方法和join()方法作用相反,能用指定的分隔符将一个string类型转换为一个数组
4.concat()方法和slice()方法类似与string类中的这两个方法,值得提出的是,方法返回的都是新的数值,原来的数组没有改变
5.push()和pop()方法,可以顾名思义了
6.shift()方法是把一个数组的第一个位置的元素删除,Unshift()方法是把一个元素放入一个数组的首位置,其余的元素向后移动
7.sort()方法是将数组中的元素首先各自调用toString()方法,然后在进行排序
8.splice()方法是将数据插入数组的中
有三种使用方式:
a.删除-------类如arr.splice(0,2) //从数组的第0个元素开始删除两个元素
b.替换而不删除------arr.splice(2,0,"red","green")在数组第2的位置处插入两个元素
c.替换且删除--------arr.splice(2,1,"red","green")删除数组的第二个元素,并在此处插入两个元素
---------------------------------------------------------------------------------------------------
【Date】类
ECMAScript中的Date类基于Java中的java.util.Date类的早期版本。
声明Date的方法:
var d = new date(0) //创建距离1970年1月1日到现在的毫秒数
Date类的一些方法:
1. UTC(),parse()方法:吧字符串转换为一个日期
var d = new Date(Date.UTC(2004,1,5));
2. toString(),valueOf()方法是以人类收悉的发放返回一个日子的字符串形式
---------------------------------------------------------------------------------------------------
【Global】对象 :该对象是程序执行开始时生成的,并包还了一些重要的方法和属性
1.encodeURI()和encodeURIComponent()方法用于编码传递给浏览器的URI。
2.eval()方法:该方法将string参数当作javascript语言来对待并执行,并且在外部可以访问期中的变量,利用这个可以玩出好多花样 :)
---------------------------------------------------------------------------------------------------
【Math】对象包含了一些有用的数学方法,这里就不阐述了
期中有个比较好玩的方法:
random()方法返回一个0和1之间的随机小数。
形式为:
number = Math.floor(Math.random()*total_number_choices(所需选择的总数) + first_possible_value(被随机的第一个值));
这样就能利用这个方法随机产生一系列所需要的整数!!
---------------------------------------------------------------------------------------------------
【作用域】
ECMAScript只有公共作用域!!
通常程序员用 var _color 的方法来强调这个属性是个私有属性,虽然它仍然是公共属性。
ECMAScript中没有静态作用域,不过可以通过和函数加入方法的方法来实现
如:
function sayHi(){
alert("hi");
}
sayHi.alternate = function(){
alert("hola");
};
sayHi();
sayHI.alternate(); // 这里的alternate方法就想一个静态方法一下
---------------------------------------------------------------------------------------------------
定义类或对象
由于javascript是晚绑定的,所以她没有固定的类的声明方式,而是通过一个函数(通常认为是构造函数)来声明的
有4种常见的声明类的方式
1.工厂模式 在函数中声明一个object对象,然后给object对象赋上所需要的属性,然后在将其返回,调用改方法是就不能用new操作符了
2.构造函数模式 和工厂模式差不多,只不过,内部不什么object对象,全部的属性和方法都用this指针,这样就可以通过new操作符来创建一个对象了。
3.原型方式 改方式利用了对象的prototype属性,可把它堪称创建新对象所依赖的原型,然后所有的属性和方法都赋予prototype属性。
如:
function Car() {}
Car.prototype.color = 'red';
Car.prototype.doors = 4;
优势:可以坚决每个对象都产生一个函数指针的毛病
但这种方式缺点也很明显。如:只有默认的无参的构造函数,而且对于引用类型的属性来说,所有衍生于这个类的对象共享这个属性。
4.混合的构造函数/原型方式
用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性。
加强版:动态原型方法
例:
function Car(Scolor, iDoors, iMpg)
{
this.color = Scolor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","Sue");
if(typeof Car._initialized == "undefined")
{
Car.prototype.showColor = function() { alert(this.color);};
}
Car._initialized = true;
}
在这个版本中,多加了一个条件的 判断,就是判断该对象是否是第一次生成,如果是就给对象函数赋值,不过已经生成过了就不用赋值了
---------------------------------------------------------------------------------------------------
字符串链接问题:
如果用 ”+“来链接几个字符串是,每次的链接都会新产生string对象,这种做法在进行大量的字符串拼接中就显得性能很低了
可以通过将字符串放入数组,然后再用join("")方法来进行字符串的拼接
---------------------------------------------------------------------------------------------------
小技巧
getTime()方法的妙用,这个方法返回的是日期的毫秒表示,用这个方法来进行程序性能上的测试,是经常的事情。
---------------------------------------------------------------------------------------------------
修改对象的属性和方法
可用通过给对象的prototype属性添加新的属性和方法来给对象增加新的属性和方法或修改属性和方法
但要注意的是,如果是修改方法和属性的时候最好是先保存原来的属性或方法的句柄,以供日后使用