我正在使用此代码通过VN.CH对象内部的VN.CH.Make()函数制作VN.CH.Mister1,但感觉它很奇怪且效率低下,无法找到更有效的方法这样做,最好是在物体内部进行,同时在线寻找。
let VN = {
CH: {
Make: function(name) {
this.Name = name;
this.Exists = 1;
}
}
};
VN.CH.Mister1 = new VN.CH.Make('Mister1');
如果任何人都可以帮助解释一种更有效的方法,或者在VN.CH对象中完成所有这些方法,或者从您在此处看到的内容指出我对Javascript的一般误解,感谢它。
答案 0 :(得分:1)
如果您需要Make
构造函数且必须在vn.ch
上,则可以使用除非标准命名以外的所有内容。显然,您可以在自己的代码中执行所需的操作,有时会调用以使异常发生,但是绝大多数情况下,JavaScript的命名标准是变量和属性以小写字母开头,因此:
let vn = {
ch: {
Make: function(name) {
this.name = name;
this.exists = 1;
}
}
};
vn.ch.mister1 = new vn.ch.Make('Mister1');
如果不需要Make
构造函数,则可以更简单地完成它:
let vn = {
ch: {
mister1: {
name: "Mister1",
exists: 1
}
}
};
如果Make
构造函数不必位于vn.ch
上,则:
function Make(name) {
this.name = name;
this.exists = 1;
}
let vn = {
ch: {
mister1: new Make("Mister1")
}
};
答案 1 :(得分:0)
我将对象创建和存储对象的位置分开。这是一个示例(如何实现)(
let peopleObj = {} // Here is where you objects life
function make (name) { // Here is where you create them
this.name = name;
this.exists = 1;
}
peopleObj.Mister1 = new make('Mister1');
peopleObj.Mister2 = new make('Mister2');
console.log(peopleObj);
答案 2 :(得分:0)
似乎您希望CH
管理某种Person
对象的集合(即VN.CH.Make
创建的对象的类型)。所以,不用写
VN.CH.Mister1 =新的VN.CH.Make('Mister1');
您可以将构造函数Make
放在VN.CH
上,并编写一个函数VN.CH.make
来添加新实例。
代码:
const VN = {
CH: {
Make: function Make(name) {
this.name = name;
this.exists = 1;
},
make(name) {
this[name] = new this.Make(name);
}
}
};
VN.CH.make('Mister1');
console.log(VN.CH.Mister1);
但是,最终,我认为如果通过创建两个具有单独关注点的类来抽象代码,则更加清楚:
PersonRegistry
,用于创建Person
实例并对其进行管理;并且,Person
代表具有name
和exists
属性的人然后仅使VN.CH
指向PersonRegistry
的实例:
代码:
class Person {
constructor(name) {
this.name = name;
this.exists = 1;
}
}
class PersonRegistry {
constructor() {
this.instances = {};
}
make(name) {
this.instances[name] = new Person(name);
}
get(name) {
return this.instances[name] || null;
}
}
const VN = {
CH: new PersonRegistry()
};
VN.CH.make('Lady1');
VN.CH.make('Mister1');
VN.CH.make('LadyA');
VN.CH.make('MisterA');
console.log(VN.CH.get('Lady1'));
console.log(VN.CH.get('Mister1'));
console.log(VN.CH.get('LadyA'));
console.log(VN.CH.get('MisterA'));
请注意,您实际上不需要类声明(您也可以使用对象文字)。但是,使用类可以更清楚地表达imo的意图,以后可以根据需要添加子类。