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. Orchard运用 - 为评论启用Gravatar头像

    在前一篇随笔中我曾分享如何为Orchard特定主题添加独立代码文件, 今儿延续如何把对应代码应用到Views上. 对此我不妨把为评论启用Gravatar头像这一例子来实现.其实很简单, 思路大概就是创 ...

  2. 详解REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

    转载自:http://www.cnblogs.com/lmule/archive/2010/10/15/1852020.html 看ecshop的lib_base.php的时候里面获取客户端真实ip的 ...

  3. BlazeMeter+Jmeter 搭建接口测试框架

    转载:http://www.sohu.com/a/133218497_575744 关于接口测试,笔者认为其难点分别在如下几方面:接口参数的获取和输入.测试数据的准备.场景的串联.测试结果的断言. 接 ...

  4. Chrome插件-把网页图片上传到七牛空间一

    功能:图片上右键,点击上传图片到七牛,把图片上传的指定空间并返回图片URL. Chrome插件本质就是js代码,但是里面有一些限制,比如事件绑定等和普通js的绑定是有区别的,主要是为了安全性考虑. 做 ...

  5. Python网络爬虫 - 2. Beautiful Soup小试牛刀

    目标: 我们解析百度首页的logo bs_baidu_logo.py from urllib.request import urlopen from bs4 import BeautifulSoup ...

  6. NFS服务的配置与应用

    一.NFS服务概述 NFS(Network File System),即网络文件系统,是使不同计算机之间能够通过网络进行文件共享的一种网络协议,多用于Linux/Unix网络系统中. 一台NFS服务器 ...

  7. CentOS 6.2下二进制安装 MySQL 5.6

    在CentOS 6.2上 二进制方式安装 MySQL5.6二进制包 可以参考这篇文章: http://www.cnblogs.com/xiaoit/p/3988640.html 一路配置下来很顺利.. ...

  8. sql中同一个Trigger里同时包含Insert,Update,Delete

    sql中同一个Trigger里同时包含Insert,Update,Delete SQLServer是靠Inserted表和Deleted表来处理的,判断一下就可以了,只不过比ORACLE麻烦一点 cr ...

  9. jQuery获取select中全部option值

    <select id="language"> <option value="">请选择</option> <optio ...

  10. xtrabackup备份方式搭建一个mysql slave

    以前mysql搭建新备库都是在现在业务较小的备库上停止同步或停止数据库,然后拷贝数据库到新备库,配置好新备库后,再开启同步或数据库.然而,这次没有空闲备库用来搭新备库.需要从一个业务繁忙的数据库中搭建 ...