问题:
为什么greet函数不返回预期值?
代码:
function Person(name){
this.name = name;
}
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + name;
}
我该如何回答这个问题?我创造了一个新人,那我该怎么办?
var John = new Person("John");
答案 0 :(得分:24)
访问方法错误。未定义变量name
,仅定义了this.name
。因此,它在函数范围中查找名为name
的变量,而不是名为name
的对象的属性。
要从对象中访问对象的属性,我们使用this
关键字。因此,我们需要使用this.name
来访问以下实现中的name
属性。
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + this.name;
}
答案 1 :(得分:4)
在您的代码中:
> function Person(name) {
> this.name = name;
> }
当作为构造函数调用时,上面将创建一个名为 name 的实例的命名属性,并为其指定 name 参数的值。
> Person.prototype.greet = function(otherName){
> return "Hi" + otherName + ", my name is " + name;
> }
此处标识符 name 用作变量,但您要查找的标识符是实例的命名属性,因此您需要以此方式访问它。通常,此函数将作为实例的方法调用,因此函数中的 this 将是对实例的引用。所以你想要:
return "Hi" + otherName + ", my name is " + this.name;
所以现在你可以这样做(请注意,以大写字母开头的变量按照惯例保留给建设者):
> var john = new Person("John");
然后:
john.greet('Fred');
因为 greet 被称为 john 的方法,它将返回:
Hi Fred, my name is John
答案 2 :(得分:0)
您需要更改问候语功能,以便将对象的名称与this
关键字一起使用:
Person.prototype.greet = function(otherName){
return "Hi" + otherName + ", my name is " + this.name;
}
之后,只需致电John.greet("other name");
答案 3 :(得分:0)
尝试以下方法:
function Person(name){
this.name = name;
this.greet = function(otherName){
return "Hi " + otherName + ", my name is " + name;
}
}
Person("Joe")
greet("Kate")