1、静态方法的定义
- varBaseClass=function(){};//varBaseClass=newFunction();
- BaseClass.f1=function(){//定义静态方法
- alert('Thisisastaticmethod');
- }
- BaseClass.f1();//Thisisastaticmethod
- varinstance1=newBaseClass();
- instance1.f1();//instance1.f1isnotafunction
由以上代码分析可知,静态方法不能被实例对象调用,再看以下代码
- varBaseClass=newFunction;
- varClass2=BaseClass;
- BaseClass.f1=function(){
- alert("BaseClass'sstaticmethod");
- }
- Class2.f2=function(){
- alert("Class2'sstaticmethod");
- }
- BaseClass.f1();//BaseClass'sstaticmethod
- BaseClass.f2();//Class2'sstaticmethod
- Class2.f1();//BaseClass'sstaticmethod
- Class2.f2();//Class2'sstaticmethod
从运行结果来看,BaseClass和Class都有f1和f2静态方法,实际上这两个函数是一样的,可以执行以下代码来验证
- alert(BaseClass==Class2);//true
如果删除其中一个函数中的静态方法,则对应的另一个函数的静态方法也被删除,比如执行
- deleteClass2.f2;
同时也会删除BaseClass中的f2
2、实例方法的定义
这里是利用javascript对象原型引用prototype来实现的,看以下代码
- varBaseClass=function(){};
- BaseClass.prototype.method1=function(){
- alert('Thisisainstancemethod');
- }
- varinstance1=newBaseClass();
- instance1.method1();//Thisisainstancemethod
method1即为通过prototype原型引用定义的实例方法,这里也可以在实例上直接定义方法(变量),看以下代码
- varBaseClass=function(){};
- varinstance1=newBaseClass();
- instance1.method1=function(){
- alert('Thisisainstancemethodtoo');
- }
- instance1.method1();//Thisisainstancemethodtoo
下面介绍通过this指针来定义实例方法(变量),看以下代码
- varBaseClass=function(){
- this.method1=function(){
- alert('Definedbythe"this"instancemethod');
- }
- };
- varinstance1=newBaseClass();
- instance1.method1();//Definedbythe"this"instancemethod
那么同时在实例上、原型引用上和“this”上定义了相同名字的实例方法后,实例会优先调用那一个呢?请看以下代码
- varBaseClass=function(){
- this.method1=function(){
- alert('Definedbythe"this"intheinstancemethod');
- }
- };
- varinstance1=newBaseClass();
- instance1.method1=function(){
- alert('Defineddirectlyintheinstancemethod');
- }
- BaseClass.prototype.method1=function(){
- alert('Definedbytheprototypeinstancemethod');
- }
- instance1.method1();//Defineddirectlyintheinstancemethod
通过运行结果跟踪测试可以看出直接定义在实例上的变量的优先级要高于定义在“this”上的,而定义在“this”上的又高于 prototype定义的变量。即直接定义在实例上的变量会覆盖定义在“this”上和prototype定义的变量,定义在“this”上的会覆盖prototype定义的变量。
3、内部方法
先看以下定义
- varBaseClass=function(){
- varmethod1=function(){
- alert("Internalmethod");
- };
- varmethod2=function(){
- alert("callInternalmethod");
- method1();
- };
- this.method3=function(){
- method2();
- }
- };
- varinstance1=newBaseClass();
- instance1.method1();//会报错,因为method1是BaseClass中定义的内部变量,作用域只有在内部可见(闭包)
- instance1.method3();//会先后调用method2和method1
从运行结果来看,内部方法只能在内部使用,即用到了闭包的实现