js 静态方法 静态变量 实例方法 实例变量

Posted 立心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 静态方法 静态变量 实例方法 实例变量相关的知识,希望对你有一定的参考价值。

1、静态方法的定义

 

Js代码  收藏代码
  1. var BaseClass = function() {}; // var BaseClass=new Function();  
  2. BaseClass.f1 = function(){//定义静态方法  
  3.      alert(\' This is a static method \');  
  4. }  
  5. BaseClass.f1();//This is a static method  
  6. var instance1 = new BaseClass();  
  7. instance1.f1();//instance1.f1 is not a function  

    由以上代码分析可知,静态方法不能被实例对象调用,再看以下代码

 

Js代码  收藏代码
  1. var BaseClass = new Function;  
  2. var Class2 = BaseClass;  
  3. BaseClass.f1 = function(){  
  4. alert("BaseClass \' s static method");  
  5. }  
  6. Class2.f2 = function(){  
  7. alert("Class2 \' s static method");  
  8. }  
  9. BaseClass.f1();//BaseClass \' s static method  
  10. BaseClass.f2();//Class2 \' s static method  
  11. Class2.f1();//BaseClass \' s static method  
  12. Class2.f2();//Class2 \' s static method  

    从运行结果来看,BaseClass和Class都有f1和f2静态方法,实际上这两个函数是一样的,可以执行以下代码来验证

 

Js代码  收藏代码
  1. alert(BaseClass == Class2);//true  

 

    如果删除其中一个函数中的静态方法,则对应的另一个函数的静态方法也被删除,比如执行

Js代码  收藏代码
  1. delete Class2.f2;  

    同时也会删除BaseClass中的f2

 

2、实例方法的定义
    这里是利用JavaScript对象原型引用prototype来实现的,看以下代码

 

Js代码  收藏代码
  1. var BaseClass = function() {};  
  2. BaseClass.prototype.method1 = function(){  
  3.       alert(\' This is a instance method \');  
  4. }  
  5. var instance1 = new BaseClass();  
  6. instance1.method1();//This is a instance method  

    method1即为通过prototype原型引用定义的实例方法,这里也可以在实例上直接定义方法(变量),看以下代码

 

Js代码  收藏代码
  1. var BaseClass = function() {};  
  2. var instance1 = new BaseClass();  
  3. instance1.method1 = function(){  
  4.     alert(\' This is a instance method too \');  
  5. }   
  6. instance1.method1();//This is a instance method too  

   下面介绍通过this指针来定义实例方法(变量),看以下代码

Js代码  收藏代码
  1. var BaseClass = function() {  
  2.  this.method1 = function(){  
  3.    alert(\' Defined by the "this" instance method\');  
  4.  }  
  5. };  
  6. var instance1 = new BaseClass();  
  7. instance1.method1();//Defined by the "this" instance method  

    那么同时在实例上、原型引用上和“this”上定义了相同名字的实例方法后,实例会优先调用那一个呢?请看以下代码

Js代码  收藏代码
  1. var BaseClass = function() {  
  2. this.method1 = function(){  
  3.        alert(\' Defined by the "this" in the instance method\');  
  4.  }  
  5. };  
  6. var instance1 = new BaseClass();  
  7. instance1.method1 = function(){  
  8.     alert(\' Defined directly in the instance method\');  
  9. }  
  10. BaseClass.prototype.method1 = function(){  
  11.     alert(\' Defined by the prototype instance method \');  
  12. }  
  13. instance1.method1();//Defined directly in the instance method  

    通过运行结果跟踪测试可以看出直接定义在实例上的变量的优先级要高于定义在“this”上的,而定义在“this”上的又高于 prototype定义的变量。即直接定义在实例上的变量会覆盖定义在“this”上和prototype定义的变量,定义在“this”上的会覆盖prototype定义的变量。


3、内部方法
   先看以下定义


  1. var BaseClass = function() {
  2. var method1 = function() {
  3. alert("Internal method");
  4. };
  5. var method2 = function() {
  6. alert("call Internal method");
  7. method1();
  8. };
  9. this.method3 = function(){
  10. method2();
  11. }
  12. };
  13. var instance1 = new BaseClass();
  14. instance1.method1();// 会报错,因为method1是BaseClass中定义的内部变量,作用域只有在内部可见(闭包)
  15. instance1.method3();//会先后调用method2和method1


另一篇记载


  1. /****************************************
  2. * 方法一
  3. * 类、方法、属性都为静态类型
  4. * 不能创建实例
  5. *****************************************/
  6. var Time = {
  7. today: 2009-3-8′,
  8. weather: rain’,
  9. show: function() {
  10. alert(‘Today is + this.today);
  11. }
  12. };
  13. //静态对象可直接使用,无需创建实例
  14. alert(‘It is + Time.weather + today.’);
  15. Time.show();
  16. //下面的代码会出错,因为静态类不能创建实例
  17. //var t = new Time();
  18. //t.show();
  19. /****************************************
  20. * 方法二
  21. * 普通对象,同时拥有静态和非静态属性、方法
  22. * 可以用实例化
  23. * 注意:
  24. * 1.静态方法/属性使用类名访问
  25. * 2.非静态方法/属性使用实例名访问
  26. *****************************************/
  27. function Person(name) {
  28. //非静态属性
  29. this.name = name;
  30. //非静态方法
  31. this以上是关于js 静态方法 静态变量 实例方法 实例变量的主要内容,如果未能解决你的问题,请参考以下文章

    Java静态方法,静态变量,初始化顺序

    python中的实例方法静态方法类方法类变量和实例变量

    static关键字

    成员变量实例变量类变量成员方法实例方法类方法的区别

    实例方法中的静态变量 - 如何解决这个问题?

    java中静态方法和实例方法的区别