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

本文详细介绍了JavaScript中静态方法、实例方法及内部方法的定义方式。包括如何通过构造函数定义静态方法,利用prototype定义实例方法,以及如何创建仅在类内部可用的内部方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、静态方法的定义

Js代码
  1. varBaseClass=function(){};//varBaseClass=newFunction();
  2. BaseClass.f1=function(){//定义静态方法
  3. alert('Thisisastaticmethod');
  4. }
  5. BaseClass.f1();//Thisisastaticmethod
  6. varinstance1=newBaseClass();
  7. instance1.f1();//instance1.f1isnotafunction
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

由以上代码分析可知,静态方法不能被实例对象调用,再看以下代码

Js代码
  1. varBaseClass=newFunction;
  2. varClass2=BaseClass;
  3. BaseClass.f1=function(){
  4. alert("BaseClass'sstaticmethod");
  5. }
  6. Class2.f2=function(){
  7. alert("Class2'sstaticmethod");
  8. }
  9. BaseClass.f1();//BaseClass'sstaticmethod
  10. BaseClass.f2();//Class2'sstaticmethod
  11. Class2.f1();//BaseClass'sstaticmethod
  12. Class2.f2();//Class2'sstaticmethod
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静态方法,实际上这两个函数是一样的,可以执行以下代码来验证

Js代码
  1. alert(BaseClass==Class2);//true
alert(BaseClass == Class2);//true

如果删除其中一个函数中的静态方法,则对应的另一个函数的静态方法也被删除,比如执行

Js代码
  1. deleteClass2.f2;
delete Class2.f2;

同时也会删除BaseClass中的f2

2、实例方法的定义
这里是利用javascript对象原型引用prototype来实现的,看以下代码

Js代码
  1. varBaseClass=function(){};
  2. BaseClass.prototype.method1=function(){
  3. alert('Thisisainstancemethod');
  4. }
  5. varinstance1=newBaseClass();
  6. instance1.method1();//Thisisainstancemethod
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原型引用定义的实例方法,这里也可以在实例上直接定义方法(变量),看以下代码

Js代码
  1. varBaseClass=function(){};
  2. varinstance1=newBaseClass();
  3. instance1.method1=function(){
  4. alert('Thisisainstancemethodtoo');
  5. }
  6. instance1.method1();//Thisisainstancemethodtoo
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指针来定义实例方法(变量),看以下代码

Js代码
  1. varBaseClass=function(){
  2. this.method1=function(){
  3. alert('Definedbythe"this"instancemethod');
  4. }
  5. };
  6. varinstance1=newBaseClass();
  7. instance1.method1();//Definedbythe"this"instancemethod
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”上定义了相同名字的实例方法后,实例会优先调用那一个呢?请看以下代码

Js代码
  1. varBaseClass=function(){
  2. this.method1=function(){
  3. alert('Definedbythe"this"intheinstancemethod');
  4. }
  5. };
  6. varinstance1=newBaseClass();
  7. instance1.method1=function(){
  8. alert('Defineddirectlyintheinstancemethod');
  9. }
  10. BaseClass.prototype.method1=function(){
  11. alert('Definedbytheprototypeinstancemethod');
  12. }
  13. instance1.method1();//Defineddirectlyintheinstancemethod
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、内部方法
先看以下定义

Js代码
  1. varBaseClass=function(){
  2. varmethod1=function(){
  3. alert("Internalmethod");
  4. };
  5. varmethod2=function(){
  6. alert("callInternalmethod");
  7. method1();
  8. };
  9. this.method3=function(){
  10. method2();
  11. }
  12. };
  13. varinstance1=newBaseClass();
  14. instance1.method1();//会报错,因为method1是BaseClass中定义的内部变量,作用域只有在内部可见(闭包)
  15. instance1.method3();//会先后调用method2和method1
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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值