js 静态方法 静态变量 实例方法 实例变量
1、静态方法的定义

- var BaseClass = function() {}; // var BaseClass=new Function();
- BaseClass.f1 = function(){//定义静态方法
- alert(' This is a static method ');
- }
- BaseClass.f1();//This is a static method
- var instance1 = new BaseClass();
- instance1.f1();//instance1.f1 is not a function
由以上代码分析可知,静态方法不能被实例对象调用,再看以下代码

- var BaseClass = new Function;
- var Class2 = BaseClass;
- BaseClass.f1 = function(){
- alert("BaseClass ' s static method");
- }
- Class2.f2 = function(){
- alert("Class2 ' s static method");
- }
- BaseClass.f1();//BaseClass ' s static method
- BaseClass.f2();//Class2 ' s static method
- Class2.f1();//BaseClass ' s static method
- Class2.f2();//Class2 ' s static method
从运行结果来看,BaseClass和Class都有f1和f2静态方法,实际上这两个函数是一样的,可以执行以下代码来验证

- alert(BaseClass == Class2);//true
如果删除其中一个函数中的静态方法,则对应的另一个函数的静态方法也被删除,比如执行

- delete Class2.f2;
同时也会删除BaseClass中的f2
2、实例方法的定义
这里是利用JavaScript对象原型引用prototype来实现的,看以下代码

- var BaseClass = function() {};
- BaseClass.prototype.method1 = function(){
- alert(' This is a instance method ');
- }
- var instance1 = new BaseClass();
- instance1.method1();//This is a instance method
method1即为通过prototype原型引用定义的实例方法,这里也可以在实例上直接定义方法(变量),看以下代码

- var BaseClass = function() {};
- var instance1 = new BaseClass();
- instance1.method1 = function(){
- alert(' This is a instance method too ');
- }
- instance1.method1();//This is a instance method too
下面介绍通过this指针来定义实例方法(变量),看以下代码

- var BaseClass = function() {
- this.method1 = function(){
- alert(' Defined by the "this" instance method');
- }
- };
- var instance1 = new BaseClass();
- instance1.method1();//Defined by the "this" instance method
那么同时在实例上、原型引用上和“this”上定义了相同名字的实例方法后,实例会优先调用那一个呢?请看以下代码

- var BaseClass = function() {
- this.method1 = function(){
- alert(' Defined by the "this" in the instance method');
- }
- };
- var instance1 = new BaseClass();
- instance1.method1 = function(){
- alert(' Defined directly in the instance method');
- }
- BaseClass.prototype.method1 = function(){
- alert(' Defined by the prototype instance method ');
- }
- instance1.method1();//Defined directly in the instance method
通过运行结果跟踪测试可以看出直接定义在实例上的变量的优先级要高于定义在“this”上的,而定义在“this”上的又高于 prototype定义的变量。即直接定义在实例上的变量会覆盖定义在“this”上和prototype定义的变量,定义在“this”上的会覆盖prototype定义的变量。
3、内部方法
先看以下定义
var BaseClass = function() {var method1 = function() {alert("Internal method");};var method2 = function() {alert("call Internal method");method1();};this.method3 = function(){method2();}};var instance1 = new BaseClass();instance1.method1();// 会报错,因为method1是BaseClass中定义的内部变量,作用域只有在内部可见(闭包)instance1.method3();//会先后调用method2和method1
/***************************************** 方法一* 类、方法、属性都为静态类型* 不能创建实例*****************************************/var Time = {today: ‘2009-3-8′,weather: ‘rain’,show: function() {alert(‘Today is ‘ + this.today);}};//静态对象可直接使用,无需创建实例alert(‘It is ‘ + Time.weather + ‘ today.’);Time.show();//下面的代码会出错,因为静态类不能创建实例//var t = new Time();//t.show();/***************************************** 方法二* 普通对象,同时拥有静态和非静态属性、方法* 可以用实例化* 注意:* 1.静态方法/属性使用类名访问* 2.非静态方法/属性使用实例名访问*****************************************/function Person(name) {//非静态属性this.name = name;//非静态方法this.show = function() {alert(‘My name is ‘ + this.name + ‘.’);}}//添加静态属性,人都是一张嘴Person.mouth = 1;//添加静态方法,哇哇大哭Person.cry = function() {alert(‘Wa wa wa …’);};//使用prototype关键字添加非静态属性,每个人的牙可能不一样多Person.prototype.teeth = 32;//非静态方法必须通过类的实例来访问var me = new Person(‘Zhangsan’);//使用非静态方法、属性me.show();alert(‘I have ‘ + me.teeth + ‘ teeth.’);//使用静态方法、属性Person.cry();alert(‘I have ‘ + Person.mouth + ‘ mouth.’);
js 静态方法 静态变量 实例方法 实例变量的更多相关文章
- Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法
总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...
- (转)java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...
- java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...
- Java中静态变量与实例变量
知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...
- 成员变量(实例变量)&局部变量&静态变量(类变量)的区别
成员变量(实例变量)&局部变量区别: (1)作用域 成员变量:针对整个类有效. 局部变量:只在某个范围内有效.(一般指的就是方法,语句体内) (2)存储位置 成员变量:随着对象的创建而存在,随 ...
- Java 中静态变量和实例变量区别
Java 中静态变量和实例变量区别 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量. 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量. 在程序运行时的区别: 实例变量属于某个对 ...
- Java笔记_静态变量和实例变量的区别
这里简单做一下笔记,区分Java全局变量里的静态变量与实例变量. 1.Java里的全局变量 首先了解Java里的全局变量,也叫成员变量. 特点: (1).一个类中既不在方法体内,也不在程序块内定义的变 ...
- java中类变量和实例变量的实质区别?
类变量和实例变量的区别 相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的. 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享. 我们可以从 ...
- iOS 成员变量,实例变量,属性变量的区别,联系
在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyV ...
随机推荐
- wsgi & cgi的一些概念解释
可以看这里 https://www.zhihu.com/question/19998865 如何理解 CGI, WSGI?修改 写补充说明 举报 添加评论 分享 • 邀请回答 默认排序 按时间排序 1 ...
- Android Logger日志系统
文件夹 文件夹 前言 执行时库层日志库liblog 源代码分析 CC日志写入接口 Java日志写入接口 logcat工具分析 基础数据结构 初始化过程 日志记录的读取过程 前言 该篇文章是我的读书和实 ...
- Kaggle : Display Advertising Challenge( ctr 预估 )
原文:http://blog.csdn.net/hero_fantao/article/details/42747281 Display Advertising Challenge --------- ...
- html 中几次方,平方米,立方米.
m的n次方表示法:mn m<sup>n</sup> 10<sup>6</sup> m的n次方表示法:mn m<sub>n</sub&g ...
- http协议中content-length 以及chunked编码分析
转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8269922 0.序 1.http/1.1协议中与chunked编码的相关字段 1)E ...
- KineticJS教程(9)
KineticJS教程(9) 作者: ysm 9.选择器 Kinetic在舞台.层和组对象上都提供了get方法,用于返回这三者中包含的对象. 9.1.根据ID获取对象 要用id获取对象,首先要给对象 ...
- QtGui.QCalendarWidget
A QtGui.QCalendarWidget provides a monthly based calendar widget. It allows a user to select a date ...
- Python类,特殊方法, __getitem__,__len__, __delitem__
特殊函数一般以__methodname__的形式命名,如:__init__(构造方法), __getitem__. __setitem__(subscriptable所需method), __deli ...
- 浅析CentOS和RedHat Linux的区别(转)
CentOS的简介 CentOS是Community ENTerprise Operating System的简称,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是Linux操作系统的一个发行 ...
- Zabbix Server和MPM(monitor for mysql)的高速部署
1. 前言 zabbix作为开源免费的监控软件.其易于管理配置和可视化的视图.历史数据的定期维护.模板化的监控项目越来越受到广大IT运维人员的喜爱. 这里主要是总结了下Zabbix S ...