我有一个场景,我需要动态创建对象。
在我的示例中,对象meta
包含在初始化Object.create()
期间要使用的构造函数的名称。
目前使用以下代码,我可以动态创建对象,但未定义属性name
。
我在结果上需要该属性;
我的剧本有什么问题?你知道更好的方法来获得相同的结果吗?
(function () {
var costructors = {
A: function () {
this.name = 'A';
console.log(this.name);
},
B: function () {
this.name = 'B';
console.log(this.name);
},
C: function () {
this.name = 'C';
console.log(this.name);
}
},
meta = {
A: true,
B: true,
C: true,
},
result = [];
function createObjs() {
Object.keys(meta).forEach(function (type) {
var obj = Object.create(costructors[type].prototype);
result.push(obj);
}.bind(this));
}
createObjs.call(this);
console.log(result);
})();

答案 0 :(得分:1)
您还没有为任何构造函数定义原型,因此您不是在实例中创建名称,因为您是从原型创建对象,而不是从构造函数创建对象。尝试
Object.create(constructors[type])
答案 1 :(得分:1)
不使用Object.create
的替代方案是:
var obj = new costructors[type]();
而不是:
var obj = Object.create(costructors[type].prototype);
答案 2 :(得分:0)
实际上,Object.create
不会调用构造函数,而只会从给定的原型中创建一个新对象。任何成员变量都可以通过属性对象提供:
var obj = Object.create(
constructors[type].prototype,
{ 'name' : { value: 'A', writable: true}}
);