javascript' function' / object中的成员函数说它不是函数

时间:2018-03-07 18:27:34

标签: javascript function object member

我正在尝试使用允许print()的在线环境来查看一些基本的Javascript。但是,当我尝试在该人的一个实例上调用say()时,它说"说"不是一个功能。我已经在几个不同的环境中尝试了这个版本的打印版本(无论是writeln,console.log还是其他),而且它总是说它不是一个功能。

//JavaScript-C24.2.0 (SpiderMonkey)

print("Hello, world!")

function person(name, age) {
    this.name = name;
    this.age = age;
    this.say = function () {
        print(this.name);
    }
}

var arrayz = [];

arrayz.push(person("bob",20));
arrayz.push(person("sally",19));
arrayz.push(person("joe",22));

for (var z in arrayz) {
       z.say();
}

我这样做的方式与此相同:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS

所以我不知道自己做错了什么。有人可以帮助我解决我在这里做错的事吗?

2 个答案:

答案 0 :(得分:4)

正确的代码应该是:

print("Hello, world!")

function person(name, age) {
    this.name = name;
    this.age = age;
    this.say = function () {
        print(this.name);
    }
}

var arrayz = [];

arrayz.push(new person("bob",20));
arrayz.push(new person("sally",19));
arrayz.push(new person("joe",22));

for (var z of arrayz) {
       z.say();
}

让我解释一下。第一个区别是new关键字。这将创建您作为对象创建的函数的新实例。你这样做只是将person称为函数。因此它将返回的person值存储到数组中而不是对象实例中。由于person未返回值,因此会将undefined存储到您的数组中。

有关new运算符的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

其次,您使用了var z in arrayz。使用in时,z将成为索引而不是对象。如果您希望z为数组项的值,则应使用var z of arrayz

有关for...in的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

有关for...of的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

答案 1 :(得分:0)

解决方案:

使用new person(...)代替person(...)将创建所需的对象,并通过在函数体中编写this.xxx = yyy来填充您指定的属性。

您的错误说明:

您只是调用该函数,这意味着您正在尝试获取其返回值并将其推送到数组中。

我在您的函数person中没有看到任何return语句,因此结果为undefined

您已在数组中推送3 undefined,并尝试对其执行say()