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. OpenCV学习(11) 图像的腐蚀与膨胀(2)

    先对一副灰度图像进行腐蚀操作,然后在腐蚀后的图像上再进行膨胀操作,我们定义这个操作为开操作. 先对一副图像进行膨胀操作,然后在膨胀后的图像上再进行腐蚀操作,我们定义这个操作为闭操作.       开操 ...

  2. go语言基础之函数类型

    1.函数类型 示例: package main import "fmt" func Add(a, b int) int { return a + b } func main() { ...

  3. 为什么Domain controller上的time synchronization非常重要?

    虚拟机默认情况下所拥有的资源都是不同的, 比如说CPU clock. 在一个忙碌的系统中, 虚拟机甚至可能在很短的一段时间内被拒绝分配资源给它, 这种情况还可能发生在高系统负荷, VMotion, B ...

  4. c#中this的用法

    在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 也可以用this来做为参数状当前实例做为参数传入方法. 还可以通过this[]来声明索引器 下 ...

  5. 【pyhon】理想论坛单帖爬虫取得信息存入MySql数据库

    代码: # 单帖爬虫,用于爬取理想论坛单个帖子得到发帖人,发帖时间和回帖时间并存入数据库,url例子见main函数 from bs4 import BeautifulSoup import reque ...

  6. (剑指Offer)面试题39:判断平衡二叉树

    题目: 输入一课二叉树的根结点,判断该树是不是平衡二叉树.如果二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 思路: 1.重复遍历结点 参考上一题求二叉树的深度,先求出根结点 ...

  7. 北京SAP-AGS CoE support consultant intern 面试总结

    7月4号去大连SAP面试.通过的话直接去北京SAP參加实习(有幸已通过). SAP一直是我理想的公司,大二的时候曾试图參加SAP大连vt项目,当时下了非常大决心,假设通过了就先留在大连,可惜英语群面就 ...

  8. C++ 11 - STL - 函数对象(Function Object) (下)

    1. 预定义函数对象 C++标准库内含许多预定义的函数对象,也就是内置的函数对象. 你可以充分利用他们,不必自己费心去写一些自己的函数对象. 要使用他们,你只要包含如下头文件 #include < ...

  9. Java并发性和多线程介绍目录

    http://ifeve.com/java-concurrency-thread-directory/

  10. 小贝_redis高级应用-公布与订阅

    redis高级应用-公布与订阅 一.公布与订阅(pub/sub)功能 二.公布与订阅(pub/sub)机制 三.redis公布与订阅(pub/sub)的实现 一.公布与订阅(pub/sub)功能 Pu ...