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.show = function() {
  32. alert(‘My name is ‘ + this.name + ‘.’);
  33. }
  34. }
  35. //添加静态属性,人都是一张嘴
  36. Person.mouth = 1;
  37. //添加静态方法,哇哇大哭
  38. Person.cry = function() {
  39. alert(‘Wa wa wa …’);
  40. };
  41. //使用prototype关键字添加非静态属性,每个人的牙可能不一样多
  42. Person.prototype.teeth = 32;
  43. //非静态方法必须通过类的实例来访问
  44. var me = new Person(‘Zhangsan’);
  45. //使用非静态方法、属性
  46. me.show();
  47. alert(‘I have ‘ + me.teeth + ‘ teeth.’);
  48. //使用静态方法、属性
  49. Person.cry();
  50. alert(‘I have ‘ + Person.mouth + ‘ mouth.’);

总结  
1.声明 静态变量,对象类.变量名,对象类.静态方法,不能使用实例调用(
    1.也可以不用对象类.来声明,但是一定不要使用var 来声明,在类 用 var声明的方法或者变量都是局部的,不用的话全局的也就是这个类的静态变量
)


2.声明非静态的变量或方法  ,( 
1.可以用this.声明   , 
2. 也可以使用对象类. prototype 来声明,
3.也可以不用this. 来声明变量或者方法,但是声明变量时要加入var 来声明它是局部的概念 )








js 静态方法 静态变量 实例方法 实例变量的更多相关文章

  1. Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法

    总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...

  2. (转)java线程安全问题之静态变量、实例变量、局部变量

    java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...

  3. java线程安全问题之静态变量、实例变量、局部变量

    java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...

  4. Java中静态变量与实例变量

    知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...

  5. 成员变量(实例变量)&局部变量&静态变量(类变量)的区别

    成员变量(实例变量)&局部变量区别: (1)作用域 成员变量:针对整个类有效. 局部变量:只在某个范围内有效.(一般指的就是方法,语句体内) (2)存储位置 成员变量:随着对象的创建而存在,随 ...

  6. Java 中静态变量和实例变量区别

    Java 中静态变量和实例变量区别 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量. 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量. 在程序运行时的区别: 实例变量属于某个对 ...

  7. Java笔记_静态变量和实例变量的区别

    这里简单做一下笔记,区分Java全局变量里的静态变量与实例变量. 1.Java里的全局变量 首先了解Java里的全局变量,也叫成员变量. 特点: (1).一个类中既不在方法体内,也不在程序块内定义的变 ...

  8. java中类变量和实例变量的实质区别?

    类变量和实例变量的区别 相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的. 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享. 我们可以从 ...

  9. iOS 成员变量,实例变量,属性变量的区别,联系

    在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyV ...

随机推荐

  1. 图片变换【Matrix】矩阵 简介

    Matrix矩阵介绍 官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html 在Android中,对图片 ...

  2. vs 字体

    看代码看得眼疼不能不说是程序员的恶梦,那么,选择适当的字体也算是对自己的救赎吧.周末闲得无聊,在网上乱逛,搜索了一些资料整理一下给大家分享,仅作记录而已,参考使用: 1.一个编程人员痛苦的选择 一般适 ...

  3. Cognos10.2.1配置加密信息不能被加密

    好奇心害死猫,可是我不是猫.这个问题已经不是第一次出现了,之前是从10.1.1到10.2.0出现的,这次是从10.2.0到10.2.1出现的,上次由于时间的问题被搁置了,这次竟然再次遇到同样的问题,已 ...

  4. (转)[ActionScript 3] Google-ProtoBuf for AS

    最近由于项目的需要,研究了一下protobuf.在这里分享一下经验,具体介绍网上也有不少,可以百度先了解一下. ProtoBuf在as中主要就是序列反序列化的作用,我们主要用它来代替amf,因为像c+ ...

  5. openstack horizon CSS 离线 改动

    Openstack horizon 的CSS主要保存在几个文件夹中,各自是horizon/static/dashboard/scss;horizon/openstack_dashboard/stati ...

  6. DoxygenToolkit.vim

    DoxygenToolkit.vim 常用命令: 光标在函数上,用 :Dox 自动生成函数的说明. 光标在文件头,用 :DoxAthor 自动生成文件说明. 下载地址

  7. HTTP 头缓存Last-Modified,ETag,Expires

    http://www.jdon.com/40381 Last-Modified和Expires针对浏览器,而ETag则与客户端无关,所以可适合REST架构中.两者都应用在浏览器端的区别是:Expire ...

  8. function(window, undefined)的意义

    var num = 10000 for (var i = 0; i++; i < num) { eval("pp" + i + "=" + i); } ( ...

  9. 扩展MSEG 加入Z字段

    append    MSEG append    IMSEG append    BAPI_TE_XMSEG 实现 BADI: MB_BAPI_GOODSMVT_CREATE BAPI中: BAPI_ ...

  10. Oracle 检索数据

    SELECT  *  |    {   [ DISTINCT  ]    column   |    expression   [   alias   ]  ,   ...    } FROM  ta ...