问题描述
我有一个场景,需要动态创建对象。
在我的示例中,对象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); })();
1楼
您尚未为任何构造函数定义原型,因此不会在实例中创建名称,因为您是从原型而不是构造函数创建对象的。 尝试
Object.create(constructors[type])
2楼
不使用Object.create
的替代方法是:
var obj = new costructors[type]();
代替:
var obj = Object.create(costructors[type].prototype);
3楼
实际上, Object.create
不会调用构造函数,而只会从给定的原型创建一个新对象。
可以通过属性对象提供任何成员变量:
var obj = Object.create(
constructors[type].prototype,
{ 'name' : { value: 'A', writable: true}}
);