为什么greet函数不返回预期值?

时间:2013-07-18 02:43:07

标签: javascript

问题:

为什么greet函数不返回预期值?

代码:

function Person(name){
    this.name = name;
}

Person.prototype.greet = function(otherName){
     return "Hi" + otherName + ", my name is " + name;
}

我该如何回答这个问题?我创造了一个新人,那我该怎么办?

var John = new Person("John");

4 个答案:

答案 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")