JavaScript类静态方法与实例方法的区别及用法详解

作者:木棉时间:2026-10-23 16:33:45浏览:346

本文深入解析JavaScript中类的静态方法与实例方法、静态变量与实例变量的区别。通过代码示例说明静态成员通过类名直接访问,实例无法调用;对比单个实例方法与所有实例共享方法的内存占用差异,推荐将共享方法定义在原型上以优化性能。

本文通过具体实例,详细解析JavaScript中类的静态方法、静态变量、实例方法以及实例变量的区别与使用场景,供读者参考学习。

1. 类的静态方法

首先通过代码进行演示与分析。


// JS类静态函数
function BaseClass() {
}
// 类添加add函数
BaseClass.add = function() {
  console.log("BaseClass add()方法被调用");
};
// 类方法(类的静态函数)直接调用
// 类名.类方法名
BaseClass.add(); //BaseClass add()方法被调用
var instance = new BaseClass();
// 实例不能调用类方法(即类的静态方法)
//instance.add();

a. 静态方法的定义方式为[类名.方法名]; b. 调用时需使用[类名.方法名()]直接执行; c. 类的实例对象无法调用类的静态方法。 原因:在JavaScript中,函数本身也是对象,因此给函数对象添加一个函数即为其添加了属性。

2. 类的静态成员

同样先通过代码进行演示与分析。


// JS类的静态成员变量
function BaseClass(params) {
}
// 类添加静态变量nameTest
BaseClass.nameTest = "jadeshu";
// 类的静态变量直接调用
// 类名.类变量名
console.log(BaseClass.nameTest); // jadeshu
var instance = new BaseClass();
// 实例不能调用类的静态成员变量)
console.log(instance.nameTest);  // undefined

a. 静态变量的定义方式为[类名.变量名]; b. 调用时需使用[类名.变量名]直接访问; c. 类的实例对象调用类的静态变量结果为undefined。 原因:在JavaScript中,函数也是对象,因此给函数对象添加一个变量即为其添加了一个属性。

3. 实例方法(分为两种情况)

I. 单个实例的方法


// JS的单个实例方法
function BaseClass() {
}
var instance1 = new BaseClass();
// 单个实例添加成员方法
instance1.add = function (params) {
  console.log("BaseClass类实例的add方法被调用" + params);
};
instance1.add(11222); // BaseClass类实例的add方法被调用11222
var instance2 = new BaseClass();
//instance2.add(); // Error: instance2.add is not a function

II. 所有实例在创建时都各自生成了同名的方法


// JS所有实例的共享方法
function BaseClass() {
  // 所有实例创建时都创建了同名的方法
  this.add = function (params) {
    console.log("BaseClass类实例的add方法被调用" + params);
  };
}
var instance1 = new BaseClass();
instance1.add(11); // BaseClass类实例的add方法被调用11
var instance2 = new BaseClass();
//实例1和实例2各有一个add函数的本地方法
instance2.add(22); // BaseClass类实例的add方法被调用22
console.log(instance1.add === instance2.add); // false

由于每个实例都拥有独立的方法副本,这会占用额外内存,既无必要又浪费系统资源。因此不建议在构造函数内部直接添加实例的本地方法。更优的做法是在外部定义函数,然后将其赋值给实例变量,这样所有实例可以引用同一份代码,但这种方式在代码结构上不够优雅。


// JS所有实例的共享方法
function add(params){
  console.log("BaseClass类实例的add方法被调用" + params);
}
function BaseClass() {
  // 所有实例创建时都创建了同名的方法
  this.add = add;
}
var instance1 = new BaseClass();
instance1.add(11); // BaseClass类实例的add方法被调用11
var instance2 = new BaseClass();
//实例1和实例2则共用add函数的代码
instance2.add(22); // BaseClass类实例的add方法被调用22
console.log(instance1.add === instance2.add); // true

对于单个实例添加方法,建议采用第一种方式;若希望所有实例共享方法,应将其添加到prototype属性上(即利用JavaScript的原型机制)。

4. 实例变量(分为两种情况)——即实例的本地属性

I. 单个实例的变量


// JS的单个实例成员变量
function BaseClass() {
}
var instance1 = new BaseClass();
// 单个实例添加成员变量
instance1.nameTest = "jadeshu";
console.log(instance1.nameTest); // jadeshu
var instance2 = new BaseClass();
console.log(instance2.nameTest); // instance2.nameTest is undefined

II. 所有实例在创建时都各自生成了同名的本地属性变量


// JS所有实例共享的成员变量
function BaseClass() {
  // 所有实例创建时都有的同名实例变量
  this.nameTest = "jadeshu";
}
var instance1 = new BaseClass();
instance1.nameTest = "shu"; // 改变实例1的变量nameTest的值为shu
console.log(instance1.nameTest);  // shu
var instance2 = new BaseClass();
//实例1和实例2各自都有一个nameTest
console.log(instance2.nameTest);; // jadeshu

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码的运行效果。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述的解析对大家掌握JavaScript程序设计有所帮助。

作者最新文章