这是在对象内部构造对象的不好方法吗?

时间:2018-09-07 06:40:13

标签: javascript

我正在使用此代码通过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的一般误解,感谢它。

3 个答案:

答案 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代表具有nameexists属性的人

然后仅使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的意图,以后可以根据需要添加子类。