如何在使用构造函数的同时触发函数"new"?



所以我有一个类的实例,我想注册所有创建的用户。 理想情况下,将它们添加到"User"类内的变量中,或者如果不可能,则添加到全局变量"users"中。我试图在该类中创建自调用函数,但它不起作用,与变量相同。目标是在使用"new"运算符创建新用户时注册用户。

我该怎么做??

var users;
class User {
constructor(email, name) {
this.email = email;
this.name = name;  
}
}
var user1 = new User("john@sds.com", "John");
var user2 = new User("san@wp.com", "San");

根据您的要求,您可以使用 weakMaps,并在每次构造函数调用时添加新用户。这将允许您存储对创建的每个新用户的弱引用,以防止在删除任何用户时发生内存泄漏。

var users = new WeakMap();
class User {
constructor(email, name) {
this.email = email;
this.name = name;  
users.set(this, email)
}
}
var user1 = new User("john@sds.com", "John");
var user2 = new User("san@wp.com", "San");

如果需要枚举它们,则需要使用数组,但是当用户被删除时,应手动将用户从数组中删除

var users = [];
class User {
constructor(email, name) {
this.email = email;
this.name = name;  
users.push(this)
}
}
var user1 = new User("john@sds.com", "John");
var user2 = new User("san@wp.com", "San");

不知道这是否接近您想要的,但请尝试一下。

var users = [];
var newUser = (function() {
class User {
constructor(email, name) {
this.email = email;
this.name = name;  
}
}
return function(email, name) {
var user = new User(email, name);
users.push(user);
return user;
}
})();


var user1 = newUser("john@sds.com", "John");
var user2 = newUser("san@wp.com", "San");
console.log(users[0], user1);
console.log(users[1], user2);

IIFE 函数返回创建用户并将其放入公共数组的函数。如果需要,您可以将数组放入 IIFE 函数中或以不同的方式重新排列。

在@colxi给出的这个答案中,我看到的一个问题是 User 类与 users 数组变量紧密耦合。如果将来您需要维护两个甚至多个单独的列表,例如管理员用户,版主用户怎么办。

我会使用一个函数来处理用户的创建并将用户推送到用户列表中。

此代码与已经建议的代码非常相似,但我已经实现了关注点分离原则

这样,您的 User 类就不必担心用户列表或其外部的任何其他内容。我们现在有一个单独的功能,负责在每次创建新用户时更新用户列表。 并且您的用户类可以移动到单独的js文件中,该文件可以导入到需要创建(任何类型的(用户的任何其他js文件中。

class User {
constructor(email, name) {
this.email = email;
this.name = name;  
}
}
var users = [];
function createUser(name,email) {
var user = new User(name,email);
users.push(user);
return user;
}
var user1 = createUser("john@sds.com", "John");
var user2 = createUser("san@wp.com", "San");

最新更新