犀牛书学习笔记(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()
posted @ 2013-11-13 13:59  LaoHoo  阅读(376)  评论(0编辑  收藏  举报