javascript定义类
作者:sagahu@163.com日期:2011-12-26
javascript中类是通过function实现的,类的对象是通过new那个function来获得。这里面包含一些细节值得探讨。
一、声明并创建单实例对象
首先需要注意的是,对于单实例对象不是通过function来实现,而是通过枚举来实现的。举个例子如下:
代码(可以建个空HTML文件,把这段代码粘帖到脚本的<Script>标签对里来测试):
代码(可以建个空HTML文件,把这段代码粘帖到脚本的<Script>标签对里来测试):
var obj1 = { Name : "zhangsan", Age : 28, SayHello : function() { alert("Hello "+this.Name); } }; obj1.SayHello();注意:这里仅是声明并创建了一个单实例对象obj1;不是类,所以没有机会new。
二、类的构造函数
声明类的构造函数可以有以下两种写法,下面以“人”类的定义为示例:
- function Human() {} 或者:
- var Human = function() {}
function Human(name, age) { this.name = name; // 成员属性如此定义 this.age = age; // 第一种声明方法的办法:在类的内部直接声明 this.methodA = function() { alert("Hello " + this.name); } } // 第二种声明方法的办法:在类的外部通过“类.prototype.方法名 = function(){}”来定义 Human.prototype.methodB = function() { alert("Hello " + this.name); } var obj1 = new Human("张三", 18); obj1.methodA(); obj1.methodB(); var obj2 = new Human(); obj2.methodA(); obj2.methodB();第二种声明方法的办法可以做到在不修改前面那部分类声明代码,而为类添加新的方法。这种办法灵活性很强,实际工作中应用较多,例如经常可以看到通过这种方法为javascript的内置对象String扩展trim()方法:String.prototype.trim()=function(){...}
三、为对象动态添加属性
看这段代码:
function Human(name, age) { this.name = name; // 成员属性如此定义 this.age = age; } var obj1 = new Human("张三", 18); // 上面类声明中并没有这个属性 obj1.sex = "男"; alert(obj1.sex);上面类声明中并没有sex这个属性,但是给它赋值、调用都成功了。这说明:在运行中可以给类动态增加实例属性。 其实,javascript关于此功能的语法是:(1)如果有这个属性,则是修改属性值;(2)如果没有这个属性,则是添加这个属性并且赋值。
四、类的静态属性与静态方法
为javascript类添加静态成员与上面动态为类添加实例属性的方法有些类似,不同之处就是:(1)上面通过对象名添加的属性是实例属性;(2)如果通过类名来添加则会成为静态成员。看示例代码:
function Human(name, age) { this.name = name; // 成员属性如此定义 this.age = age; } Human.count = 100; // 静态属性 Human.staticMethod = function() { alert("Hello " + Human.count); } // 静态方法 Human.staticMethod(); // 调用静态方法 var obj1 = new Human("张三", 18); obj1.staticMethod(); // 静态方法不能通过对象来调用,本行代码会报错!