2013-07-18 27 views
13

Câu hỏi:Tại sao hàm chào mừng không trả lại giá trị mong đợi?

Tại sao hàm chào mừng không trả lại giá trị mong đợi?

Code:

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

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

Làm thế nào để trả lời câu này? Tôi tạo ra một người mới thì tôi phải làm gì?

var John = new Person("John"); 

Trả lời

24

Phương pháp truy cập sai. biến số name không được xác định, chỉ có this.name được xác định. Vì vậy, nó tìm kiếm một biến trong phạm vi chức năng được gọi là name thay vì một thuộc tính của đối tượng được gọi là name.

Để truy cập thuộc tính của đối tượng từ bên trong đối tượng, chúng tôi sử dụng từ khóa this. Do đó, chúng tôi cần sử dụng this.name để truy cập thuộc tính name trong việc triển khai bên dưới.

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

Object độ phân giải bất động sản không có gì để làm với phạm vi. Cụm từ "Phạm vi sai" sẽ tốt hơn là "phương pháp truy cập sai". – RobG

+0

đủ công bằng. đã chỉnh sửa. –

+0

cảm ơn sự giúp đỡ – flylib

0

Bạn cần phải thay đổi chức năng Greet sử dụng tên của đối tượng với this keyword:

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

sau đó, chỉ cần gọi John.greet("other name");

+0

cảm ơn sự giúp đỡ – flylib

4

Trong mã của bạn:

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

Khi được gọi là hàm tạo, phần trên sẽ tạo thuộc tính có tên là n được gọi là tên và gán giá trị cho thông số tên.

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

Ở đây định danh tên được sử dụng như là một biến, nhưng nhận diện bạn đang tìm kiếm là một tài sản của ví dụ đặt tên, vì vậy bạn cần phải truy cập nó ở như vậy. Thông thường, hàm này sẽ được gọi là phương thức của cá thể sao cho số trong hàm này sẽ là tham chiếu đến cá thể.Vì vậy, bạn muốn:

 return "Hi" + otherName + ", my name is " + this.name; 

Vì vậy, bây giờ khi bạn có thể làm (lưu ý rằng các biến bắt đầu với một chữ cái viết hoa là, theo quy ước, dành cho construtors):

> var john = new Person("John"); 

và sau đó:

john.greet('Fred'); 

chào được gọi là phương thức john, số này sẽ trả về:

Hi Fred, my name is John 
+0

cảm ơn sự giúp đỡ – flylib

1

Ngoài ra, vì đây là một vấn đề của phạm vi thừa kế (chức năng thứ hai không có quyền truy cập vào các "tên" biến), chúng ta có thể nói lại mã trông như thế này để bao gồm tất cả theo chức năng Person:

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

Hoạt động tốt.

0

Hãy thử như sau:

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

Person("Joe") 
greet("Kate") 
Các vấn đề liên quan