JS当中怎么定义一个类
1. 使用 ES6 类语法(推荐)
这是 ES6 引入的语法糖,让类的定义更加直观清晰。
基本结构
class MyClass {// 构造函数,用于初始化对象constructor(param1, param2) {this.property1 = param1;this.property2 = param2;}// 实例方法instanceMethod() {return `属性值: ${this.property1}`;}// 静态方法,通过类名直接调用static staticMethod() {return '这是静态方法';}// getter 方法,用于获取属性值get computedProperty() {return this.property1 + this.property2;}// setter 方法,用于设置属性值set computedProperty(value) {this.property1 = value / 2;this.property2 = value / 2;}
}// 类的使用
const obj = new MyClass(1, 2);
console.log(obj.instanceMethod()); // 输出: 属性值: 1
console.log(MyClass.staticMethod()); // 输出: 这是静态方法
console.log(obj.computedProperty); // 输出: 3
obj.computedProperty = 10;
console.log(obj.property1); // 输出: 5
继承
class ChildClass extends MyClass {constructor(param1, param2, param3) {super(param1, param2); // 调用父类的构造函数this.property3 = param3;}// 重写父类方法instanceMethod() {return `${super.instanceMethod()} 和 ${this.property3}`;}
}const childObj = new ChildClass(1, 2, 3);
console.log(childObj.instanceMethod()); // 输出: 属性值: 1 和 3
2. 使用构造函数和原型(ES6 之前的方式)
这是 JavaScript 传统的实现类的方式。
基本结构
function MyClass(param1, param2) {this.property1 = param1;this.property2 = param2;// 私有属性和方法(外部无法直接访问)const privateProperty = '私有属性';function privateMethod() {return privateProperty;}// 特权方法(可以访问私有属性和方法)this.privilegedMethod = function() {return privateMethod();};
}// 原型方法(所有实例共享同一个方法)
MyClass.prototype.instanceMethod = function() {return `属性值: ${this.property1}`;
};// 静态方法
MyClass.staticMethod = function() {return '这是静态方法';
};// 类的使用
const obj = new MyClass(1, 2);
console.log(obj.instanceMethod()); // 输出: 属性值: 1
console.log(MyClass.staticMethod()); // 输出: 这是静态方法
console.log(obj.privilegedMethod()); // 输出: 私有属性
继承
function ChildClass(param1, param2, param3) {MyClass.call(this, param1, param2); // 调用父类的构造函数this.property3 = param3;
}// 继承父类的原型方法
ChildClass.prototype = Object.create(MyClass.prototype);
ChildClass.prototype.constructor = ChildClass;// 重写父类方法
ChildClass.prototype.instanceMethod = function() {return `${MyClass.prototype.instanceMethod.call(this)} 和 ${this.property3}`;
};const childObj = new ChildClass(1, 2, 3);
console.log(childObj.instanceMethod()); // 输出: 属性值: 1 和 3
两种方式的区别
特性 | ES6 类语法 | 构造函数和原型 |
---|---|---|
语法 | 简洁、直观 | 复杂、容易混淆 |
继承 | 简单,使用 extends | 复杂,需要手动设置原型 |
静态方法 | 内置支持 | 需要手动添加到构造函数 |
私有属性 | 需要特殊处理(# 语法) | 通过闭包实现 |
其他注意事项
- 箭头函数:不适合用于定义类方法,因为它没有自己的
this
,会继承外层的this
。 - 私有属性和方法:在 ES6 类中,可以使用
#
前缀定义私有属性和方法(如#privateProperty
)。 - 类表达式:类也可以用表达式的方式定义(如
const MyClass = class {}
)。
// 在JS当中怎么定义一个类。function User(a, b){// 属性this.usercode = a;this.username = b;// 方法(实例方法,通过对象调用的。)this.doSome = function(){console.log(this.username + " doSome....")}// 静态方法(直接用类名调用)User.doOther = function(){console.log("user doOther....")}}/*User = function(usercode, username){// 属性this.usercode = usercode;this.username = username;// 方法(实例方法,通过对象调用的。)this.doSome = function(){console.log(username + " doSome....")}// 静态方法(直接用类名调用)User.doOther = function(){console.log("user doOther....")}}*/