全部博文(2065)
分类: 系统运维
2010-03-11 21:15:08
Javascript面向对象编程整理
[整理人:遥方 整理时间:
1. 用JavaScript实现类
JavaScritpt没有专门的机制实现类,这里是借助它的函数允许嵌套的机制来实现类的。一个函数可以包含变量,又可以包含其它函数,这样,变量可以作为属性,内部的函数就可以作为成员方法了。因此外层函数本身就可以作为一个类了。如下:
function myClass()
{
//此处相当于构造函数
}
PS: JS不像JAVA那样可以定义出来一个关键字public class 这样明显地声明出来一个类的!在JS里面我们定义一个函数的时候里面是可以包含变量的。还可以包含内部函数(即函数里面再套函数)这样就可以定义出来成员方法了。这样不就是类似于JAVA里面的CLASS了嘛。
2. 如何获得一个类的实例
实现了类就应该可以获得类的实例,JavaScript提供了一个方法可以获得对象实例。即 new操作符。 其实JavaScript中,类和函数是同一个概念,当用new操作一个函数时就返回一个对象。如下:
var obj1 = new myClass();
PS:发现JS里面的定义类的实例的方法与JAVA的惊人的相似哦。也是通过new关键字来定义出来的。
3. 对象的成员的引用
在JavaScript中引用一个类的属性或方法的方法有以下三种。
1> 点号操作符
这是一种最普遍的引用方式,就不累赘。即如下形式:
对象名.属性名;
对象名.方法名;
PS:在JAVA里面定义出来一个对象之后MyClass myobjcts = new MyClass();
然后就可以引用里面的属性与方法 myobjcts.name
myobjcts.function
以后我使用的时候一般会通过这种方法调用的。即类似于JAVA里面的操作方法一样的!
2> 方括号引用
JavaScript中允许用方括号引用对象的成员。如下:
对象名["属性名"];
对象名["方法名"]; // 这种情况我倒是没见过哦!
这里方括号内是代表属性或方法名的字符串,不一定是字符串常量。也可以使用变量。这样就可以使用变量传递属性或方法名。
3> 使用eval函数
如果不希望使用变量传递变量或方法名,又不想使用条件判断,那么eval函数是一个好的选择。eval接收一个字符串类型的参数,然后将这个字符串作为代码在上下文中执行,返回执行的结果。
alert(eval("对象名." + element.value));
4. 对对象属性,方法的添加、修改和删除操作
JavaScript中,在生成对象之后还可以为对象动态添加、修改和删除属性和方法,这与其它面向对象的语言是不同的。
PS:确实哦 在JAVA里面如果类都定好了是不可以去通过对象来创改其内部的属性与方法的。绝对不可能的了。
1> 添加属性和方法先创建一个对象,空对象创建后没有任何属性和方法,然而我们可以在代码中创建。
var obj1 = new Object(); //空对象创建
//添加属性
obj1.ID = 1; //动态创建属性出来
obj1.Name = "johnson";
//添加方法 //动态创建方法出来
obj1.showMessage = function() //所创建出来的方法值
{
alert("ID: " + this.ID + ", Name: " + this.Name);
}
PS: 感觉JS里面的THIS关键字与JAVA的this是一样的使用。表示引用当前的对象实例!
2> 修改属性与方法
与添加属性和方法类似,例如接着上面的例子:
// 修改属性
obj1.ID = 2;
obj1.Name = "Amanda";
// 修改方法
obj1.showMessage = function()
{
alert("ID: " + this.ID");
3> 删除属性与方法
直接将要删除的属性或方法赋值为undefined即可:
obj1.ID = 1;
obj1.Name = undefined;
obj1.showMessage = undefined;
PS:将属性与方法删除的方法都是赋为undefined。包括了方法哦!
5. 创建无类型对象。
var obj1 = {};
var obj2 =
{
ID: 1,
Name: "Johnson",
showMessage: function()
{
alert("ID: " + this.ID + "Name: " + this.Name);
}
}
这里定义了两个无类型的对象,obj1和obj2。其中obj1是一个空对象。obj2包括两个属性ID, Name和一个方法showMessage。每个属性和方法用逗号分割。属性(方法)名和其值之间用分号分割。用这种方式创建属性方法时,也可以用字符串定义属性方法的名字。如:
var obj2 =
{
"ID" : 1,
"Name": "Johnson"
}
PS:其实这种定义非常类似于JSON的定义了。JSON也是这样的方式定义的!
6. prototype
每个函数对象都具有一个子对象prototype,因为函数也可以表示类,所以prototype表示一个类的成员的集合。当new 一个对象时,prototype对象的成员都会被实例化成对象的成员。
function myClass()
{ }
myClass.prototype.ID = 1;
myClass.prototype.Name = "johnson";
myClass.prototype.showMessage = function()
{
alert("ID: " + this.ID + "Name: " + this.Name);
}
var obj1 = new myClass();
obj1.showMessage();
PS:这里面我们就使用了原型的思想进来的!定义一个类的原型然后使用原型来动态创建属性与方法出来了!
哦。我明白了prototype 的作用了原来它是表示定义的一个类的原型呀。通过原型就可以动态创建出来这个类的属性与方法出来了!
使用prototype对象创建类有一个好处。如果将所有的成员直接写在类的声明中,如下:
function myClass()
{
//添加属性
this.ID = 1;
this.Name = "johnson";
//添加方法
this.showMessage = function()
{
alert("ID: " + this.ID + ", Name: " + this.Name);
}
}
var obj1 = new myClass();
var obj2 = new myClass();
在上面的代码中,定义了一个类myClass,在类中直接定义了两个属性和一个方法。然后实例化了两个对象,这里的两个属性和一个方法,每创建一次 myClass对象都会被创建一次,浪费了内存空间。而用prototype以后就可以解决这个问题,每new一个函数时,其prototype对象的成 员都会自动赋给这个对象,当new多个对象时不会重复创建。
PS:在使用面向对象的时候可以先创建出来一个空对象然后使用原型出来。
这是入门篇。下一篇将整理有关中级面向对象