2012-09-04 47 views
52

Tôi đang tham gia một số bài học JavaScript/jQuery tại codecademy.com. Thông thường các bài học cung cấp câu trả lời hoặc gợi ý, nhưng đối với bài học này, nó không đưa ra bất kỳ sự trợ giúp nào và tôi hơi bối rối bởi các hướng dẫn.JavaScript: hàm trả về một đối tượng

Nó nói để làm cho hàm makeGamePlayer trả về một đối tượng có ba khóa.

//First, the object creator 
function makeGamePlayer(name,totalScore,gamesPlayed) { 
    //should return an object with three keys: 
    // name 
    // totalScore 
    // gamesPlayed 
} 

Tôi không chắc chắn nếu tôi nên làm điều này

//First, the object creator 
function makeGamePlayer(name,totalScore,gamesPlayed) { 
    //should return an object with three keys: 
    // name 
    // totalScore 
    // gamesPlayed 

     this.name = name; 
     this.totalScore = totalScore; 
     this.gamesPlayed = gamesPlayed; 
} 

hoặc một cái gì đó như thế này

//First, the object creator 
    function makeGamePlayer(name,totalScore,gamesPlayed) { 
     //should return an object with three keys: 
     // name 
     // totalScore 
     // gamesPlayed 

     var obj = { 
      this.name = name; 
      this.totalScore = totalScore; 
      this.gamesPlayed = gamesPlayed; 
      } 
    } 

Tôi có để có thể sửa đổi các thuộc tính của đối tượng sau khi nó tạo.

Trả lời

84

Trong JavaScript, hầu hết functions đều callable và instantiable: họ có cả một [[Call]][[Construct]] phương pháp nội bộ.

Là đối tượng có thể gọi, bạn có thể sử dụng dấu ngoặc đơn để gọi cho chúng, tùy ý chuyển một số đối số. Do cuộc gọi, chức năng có thể return a value.

var player = makeGamePlayer("John Smith", 15, 3); 

Mã cuộc gọi trên hoạt makeGamePlayer và lưu trữ các giá trị trả về trong biến player. Trong trường hợp này, bạn có thể muốn xác định các chức năng như thế này:

function makeGamePlayer(name, totalScore, gamesPlayed) { 
    // Define desired object 
    var obj = { 
    name: name, 
    totalScore: totalScore, 
    gamesPlayed: gamesPlayed 
    }; 
    // Return it 
    return obj; 
} 

Thêm vào đó, khi bạn gọi một chức năng bạn cũng đang đi qua một cuộc tranh cãi thêm dưới mui xe, trong đó xác định giá trị của this bên trong hàm. Trong trường hợp trên, vì makeGamePlayer không được gọi là phương thức, giá trị this sẽ là đối tượng toàn cục ở chế độ cẩu thả hoặc không được xác định ở chế độ nghiêm ngặt.

Là nhà thầu, bạn có thể sử dụng new operator để khởi tạo chúng. Toán tử này sử dụng [[Construct]] phương pháp nội bộ (chỉ có sẵn trong nhà thầu), mà làm điều gì đó như thế này:

  1. Tạo một đối tượng mới mà thừa hưởng từ .prototype của các nhà xây dựng
  2. kêu gọi các nhà xây dựng đi qua đối tượng này như this giá trị
  3. Nó trả về giá trị được trả về bởi hàm tạo nếu đó là đối tượng hoặc đối tượng được tạo ở bước 1 nếu không.
var player = new GamePlayer("John Smith", 15, 3); 

Đoạn mã trên tạo ra một thể hiện của GamePlayer và lưu trữ các giá trị trả về trong biến player. Trong trường hợp này, bạn có thể muốn xác định các chức năng như thế này:

function GamePlayer(name,totalScore,gamesPlayed) { 
    // `this` is the instance which is currently being created 
    this.name = name; 
    this.totalScore = totalScore; 
    this.gamesPlayed = gamesPlayed; 
    // No need to return, but you can use `return this;` if you want 
} 

Theo quy ước, tên constructor bắt đầu với một ký tự hoa.

Lợi thế của việc sử dụng hàm tạo là các phiên bản kế thừa từ GamePlayer.prototype. Sau đó, bạn có thể định nghĩa các thuộc tính đó và làm cho họ có sẵn trong tất cả các trường

+3

@OP cũng lưu ý rằng khi bạn định gọi nó bằng từ khóa 'mới', tôi khuyên bạn nên bắt đầu tên bằng vốn:' MakeGamePlayer'. – PeeHaa

+2

@ Oriol – kiểm tra đối tượng của bạn theo nghĩa đen, nó có lỗi cú pháp. – RobG

+3

@PeeHaa Lời khuyên tốt, cũng là quy ước đặt tên thông thường hơn khi sử dụng hàm tạo sẽ là 'mới GamePlayer()'. –

29

Bạn chỉ có thể làm điều đó như thế này với một object literal:

function makeGamePlayer(name,totalScore,gamesPlayed) { 
    return { 
     name: name, 
     totalscore: totalScore, 
     gamesPlayed: gamesPlayed 
    }; 
} 
2

tôi sẽ có những hướng dẫn để có nghĩa là:

function makeGamePlayer(name,totalScore,gamesPlayed) { 
     //should return an object with three keys: 
     // name 
     // totalScore 
     // gamesPlayed 

     var obj = { //note you don't use = in an object definition 
      "name": name, 
      "totalScore": totalScore, 
      "gamesPlayed": gamesPlayed 
      } 
     return obj; 
    } 
+1

Tại sao bạn có dấu chấm phẩy bên trong đối tượng? –

+0

@AlexG đẹp bắt, không thể tin rằng không ai khác đã làm trong 4 năm kể từ lần đầu tiên tôi đăng câu trả lời này. Nó chắc chắn là một công việc cắt giảm n-paste của đối tượng gốc của OP mà tôi và nó trông giống như một vài thứ khác được tạo ra. – scrappedcola

2

Cả hai phong cách, với một chút tinh chỉnh, sẽ làm việc.

Phương pháp đầu tiên sử dụng Trình xây dựng Javascript, giống như hầu hết mọi thứ đều có ưu điểm và nhược điểm.

// By convention, constructors start with an upper case letter 
function MakePerson(name,age) { 
    // The magic variable 'this' is set by the Javascript engine and points to a newly created object that is ours. 
    this.name = name; 
    this.age = age; 
    this.occupation = "Hobo"; 
} 
var jeremy = new MakePerson("Jeremy", 800); 

Mặt khác, phương pháp khác của bạn được gọi là 'Mô hình đóng cửa tiết lộ' nếu tôi nhớ chính xác.

function makePerson(name2, age2) { 
    var name = name2; 
    var age = age2; 

    return { 
    name: name, 
    age: age 
    }; 
} 
+0

Tôi nghĩ bạn đã quên một cuộc gọi mới trước cuộc gọi 'MakePerson' trong ví dụ mã đầu tiên của mình. –

+0

@Mat - Vì vậy, tôi đã làm. Thêm. Cảm ơn bạn. –

Các vấn đề liên quan