Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法访问对象datamember,尽管它在console.log中显示存在。尝试的访问返回未定义_Javascript_Arrays_Function_Object - Fatal编程技术网

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)[ƒ,ƒ]