我正在尝试使用允许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
所以我不知道自己做错了什么。有人可以帮助我解决我在这里做错的事吗?
答案 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()
。