犀牛书学习笔记(7):定义和使用类或对象
严格来说,javascript没有类,但为了便于理解,我们将类和对象当做同一个概念来说。
javascript有很多种定义类的方式,这还真有点狗血,选择太多必然增加了语言的复杂度,所以我们需要评估、选择合适的方式。
类或对象定义
我们先看看JAVA类定义方式
class Car { public String color = "blue"; public int doors = 4; public int mpg = 25; public Car(String color, int doors, int mpg) { this.color = color; this.doors = doors; this.mpg = mpg; } public void showColor() { System.out.println(color); } }
javascritp推荐定义方式:混合构造函数和原型的方式
function Car(sColor,iDoors,iMpg) { this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","John"); } Car.prototype.showColor = function() { //使用Car对象的原型添加方法showColor alert(this.color); };
//到这里,类定义完成 var oCar1 = new Car("red",4,23); var oCar2 = new Car("blue",3,25);
oCar1.triger=function(){ //给类实例oCar1对象添加一个方法triger
//body
}
oCar1.drivers.push("Bill"); alert(oCar1.drivers); //输出 "Mike,John,Bill" alert(oCar2.drivers); //输出 "Mike,John"
1、首先定义了构造函数构造函数Car,构造函数具有多个参数,这里只定义属性,属性值可通过参数值传递进行初始化。请注意函数属性的定义方式,需要使用this,this的值是实例化类
后的对象。
2、Car.prototype是调用类的原型,为原型增加方法showColor,为其赋值一个匿名函数,这样就算给类car定义了方法,还记得前面说到吗,类的方法就是赋值给一个类属性的函数。
3、oCar1是类Car的实例,new操作符创建了一个没有任何属性的对象,然后调用构造函数,如果构造函数有参数,可以给参数赋值。新的对象会赋值给this,
这就是一个类定义,包括定义属性和方法,并通过类实例化对象的过程。
类或对象动态性
javascript这类弱类型语言,通常也称为动态语言,弱类型带来修改类型的灵活性。想想JAVA,类都是预先定义好的,实例化成对象之后,运行过程中一般都不会修改。采用反射自省方式才能动态修改类,往往成为高级编程技巧,且会非常大的影响性能。
使用prototype,可以非常方便的为任意对象修改属性和方法。
创建新方法
Number.prototype.toHexString = function() { return this.toString(16); }; // 为Number对象创建新方法
重命名方法
Array.prototype.enqueue = function(vItem) { this.push(vItem); }; Array.prototype.dequeue = function() { return this.shift(); }; //添加两个新方法封装覆盖了已有方法
为本地对象添加方法
Object.prototype.showValue = function () { alert(this.valueOf()); }; var str = "hello"; var iNum = 25; str.showValue(); //输出 "hello" iNum.showValue(); //输出 "25" // 给 ECMAScript 中每个本地对象添加新方法,必须在 Object 对象的 prototype 属性上定义它。所有本地对象都继承了 Object 对象,所以对 Object 对象做任何改变,都会反应在所有本地对象上。
定义类的时候可考虑定义的方法
- toString()
- valueOf()
- compareTo()