`

javascript中静态方法、实例方法、内部方法和原型的一点见解

阅读更多

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

   从运行结果来看,内部方法只能在内部使用,即用到了闭包的实现

分享到:
评论
1 楼 董宗磊 2012-10-26  
非常好。。。顶楼主

相关推荐

    (js)静态与非静态方法

    在JavaScript中,静态方法与非静态方法是面向对象编程中的两个基本概念,它们在类的定义和实例化过程中扮演着重要角色。理解这两者之间的区别对于编写高效、可维护的代码至关重要。 ### 静态方法 #### 定义 静态...

    举例说明JavaScript中的实例对象与原型对象_.docx

    此外,`Person.prototype`可以看作是构造函数`Person`的静态部分,而`person`的属性和方法是实例的动态部分。JavaScript引擎在查找属性时会沿着原型链查找,如果在实例对象本身找不到,就会去原型对象中寻找,直到...

    ES6 javascript中class静态方法、属性与实例属性用法示例

    在这次更新中,引入了“class”这一语法糖,简化了对象原型链的创建和继承,也引入了静态方法(static method)和静态属性(static property)。在传统的JavaScript编程中,对象是通过函数构造器和原型链来创建的,...

    JavaScript基础之静态方法和实例方法分析

    在JavaScript中,对象和函数是核心概念,而静态方法和实例方法是面向对象编程中的两个重要特性,它们各自有不同的用途和访问方式。 **静态方法** 是直接定义在构造函数(类)本身上的方法,而不是其实例或原型链上...

    浅谈Javascript的静态属性和原型属性

    在JavaScript中,对象的创建和方法的定义有两种主要方式:静态属性和原型属性。本文将深入探讨这两种属性及其在JavaScript中的使用。 首先,静态属性(static properties)是属于类本身而不是类的实例的属性。它们...

    js静态方法与实例方法分析

    JavaScript中的静态方法和实例方法是面向对象编程中的两个核心概念,它们在定义和使用上有着显著的区别,且各自有其特定的应用场景。 首先,我们来理解什么是静态方法。静态方法是属于类(构造函数)本身的方法,而...

    javascript面向对象特性代码实例

    继承是面向对象编程的另一个重要概念,它允许一个类获取另一个类的属性和方法。文中展示了两种实现继承的方法。第一种方法利用构造函数和apply、call方法来实现继承,这种方法的优点是可以实现多继承,但缺点是使用...

    javascript面向对象特性代码实例.docx

    - **方法一**(原型链继承):通过调用父构造函数或者使用`call`或`apply`方法,将父类的属性和方法复制到子类的实例上。这种方法不能实现多继承,且`instanceof`运算符返回的结果可能不准确。 - **方法二**(原型...

    浅析JavaScript中的类型和对象

    可以为构造函数添加静态属性和方法,静态属性和方法是直接定义在构造函数上的,而不是实例上。 在JavaScript中,实例化对象时,并不能在其.prototype属性上添加属性或方法。这会导致编译错误,因为.prototype属性是...

    javascript实例100例

    7. **面向对象编程**:JavaScript支持基于原型的面向对象编程,包括构造函数、原型链、对象继承和方法覆盖。ES6引入了类和静态方法,使面向对象编程更加简洁。 8. **定时器与回调函数**:setTimeout和setInterval...

    《突破JavaScript编程实例五十讲》源文件

    JavaScript是一种广泛使用的客户端脚本语言,它在网页开发中扮演着至关重要的角色,使得网页不仅限于静态展示,而是能够实现丰富的用户交互。 本书的核心在于通过实例来教授JavaScript编程技巧,帮助读者理解和掌握...

    JavaScript中原型和原型链详解

    在探讨JavaScript中原型和原型链的详细知识前,我们首先要了解JavaScript对象的几个核心概念,包括私有变量和函数、静态变量和函数以及实例变量和函数。这些都是理解原型和原型链的基础。 私有变量和函数属于一个...

    Javascript原型继承

    JavaScript原型继承是面向对象编程在JavaScript中的实现方式之一,它基于原型(Prototype)和对象的特性,使得一个对象可以继承另一个对象的属性和方法。在JavaScript中,每个对象都有一个特殊的内部属性`[...

    js面向对象之静态方法和静态属性实例分析

    JavaScript是一种基于原型的面向对象编程语言,它允许我们创建具有属性和方法的对象。在JavaScript中,面向对象编程涉及类的概念,尽管JavaScript并没有真正的类,但它提供了构造函数来模拟类的行为。在面向对象的...

    JavaScript实例自学手册:通过486个例子掌握.net开发捷径

    5. 对象与原型:理解JavaScript中的对象创建和原型链,以及如何通过原型实现继承。 二、JavaScript高级特性 1. 异步编程:学习事件循环、回调函数、Promise和async/await,掌握异步处理方法。 2. 模块化:了解...

    JavaScript动态网页编程实例手册

    《JavaScript动态网页编程实例手册》是一本专注于JavaScript技术在创建动态网页中的应用的书籍,作者为张长富,由海洋出版社出版。这本书旨在通过丰富的实例和习题解答,帮助读者深入理解和掌握JavaScript语言,从而...

    JavaScript面向对象之私有静态变量实例分析

    `JSClass`函数返回一个构造函数,这个构造函数的实例可以访问到这些私有静态变量和方法。尽管`privateStaticVariable`和`privateStaticMethod`不在构造函数的原型链上,但它们可以通过`test1`、`test2`和`test3`这些...

Global site tag (gtag.js) - Google Analytics