Javascript 无法访问对象datamember,尽管它在console.log中显示存在。尝试的访问返回未定义
我有一个匿名函数数组,它们是构造函数,它们接受一个参数,然后用它来构建一个变量Javascript 无法访问对象datamember,尽管它在console.log中显示存在。尝试的访问返回未定义,javascript,arrays,function,object,Javascript,Arrays,Function,Object,我有一个匿名函数数组,它们是构造函数,它们接受一个参数,然后用它来构建一个变量 var template = [ function (model){ this.html = "blah" + model.something}, function (model){ this.html = "blah" + model.something}, ] 我循环遍历数组,并使用new关键字将每个函数构造成一个对象 template.foreach( template => tem
var template = [
function (model){ this.html = "blah" + model.something},
function (model){ this.html = "blah" + model.something},
]
我循环遍历数组,并使用new关键字将每个函数构造成一个对象
template.foreach( template => template = new template(model))
这似乎是可行的,因为当I console.log时,它将模板显示为包含数据成员This.html的对象列表,并且其填充正确
但是,当我尝试访问模板[0].html时,它返回undefined
当我在列表的某个元素上执行typeof
时,它会显示函数,但浏览器会将其显示为对象,最重要的是,当我执行模板[0]时,它会返回未定义的html,尽管在控制台记录列表时会显示它
forEach()
而不是forEach()
使用
This
是一种非常奇怪的方法,因为当您在数组中存储函数时,This
引用了您调用该函数的对象 重点是forEach并没有改变正在迭代的数组,它只是在迭代它。如果要返回已创建对象的数组,可以使用其他函数,如map:
const myObjectArray = template.map(t => new t(model));
现在您可以访问myObjectArray[0].html
请注意,myObjectArray是一个新数组,并且模板不会更改
顺便说一句,使用一个名为template的变量来保存数组不是一个好做法,最好将其称为templateArray或templates(请明确它是一个数组)为什么总是要返回一些内容?可以在js中将函数用作对象。因此,函数是一个构造函数,用这个关键字加载对象。如果他们允许我编辑我自己的问题,那么我可以将foreach更改为foreach。我只能编辑我的评论。关于函数不需要返回某物,您是对的。但是,当您执行
模板[0]时,您将有一个未定义的值。html
因为模板[0](这是一个函数)中没有返回任何内容。这就是我的意思。forEach((模板,索引)=>模板[index]=新模板(模型)),在这里工作,但不在我的程序中。。。。谢谢A.洛伦特,我能把一个函数映射到它自己吗。我不想创建一个新的变量,因为我不需要它。是的,您可以,但不建议这样做。遵循不重新分配变量的代码要容易得多,因此您的数组带有模板,数组带有对象。有两个变量不是问题,引擎可以处理这两个变量,甚至更多;)它仍然不起作用,我试着在上面的行中定义temp,但它仍然有未定义的temp。此外,我还尝试使用temp作为列表,并将每个新对象推送到列表中,但仍然没有定义。getModel().then(model=>{var temp=templates.map(template=>new template(model))})console.log(temp[0].html,typeof templates[0],templates)//未定义函数,函数列表如果我在控制台中运行此代码,它将按预期工作:var templates=[function(model){this.html=“blah”+model.something},function(model){this.html=“blah”+model.something},];var temp=templates.map(template=>newtemplate({}));console.log(temp[0].html,typeof templates[0],templates);//blahun定义的函数(2)[ƒ,ƒ]