JavaScript: hàm trả về một đối tượng


85

Tôi đang tham gia một số bài học về 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 giúp ích gì cả và tôi hơi bối rối trước các hướng dẫn.

Nó nói để thực hiện hàm makeGamePlayer trả về một đối tượng có ba phím.

//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 liệu tôi có nên làm điều này không

//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 thứ gì đó giống 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 phải có thể sửa đổi các thuộc tính của đối tượng sau khi nó được tạo.

Câu trả lời:


143

Trong JavaScript, hầu hết các hàm đều có thể gọi và có thể tạo: chúng có cả [[Gọi]][[Cấu trúc]] phương thức bên trong .

Là các đối tượng có thể gọi, bạn có thể sử dụng dấu ngoặc đơn để gọi chúng, tùy chọn chuyển một số đối số. Theo kết quả của cuộc gọi, hàm có thể trả về một giá trị .

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

Đoạn mã trên gọi hàm makeGamePlayervà lưu trữ giá trị trả về trong biến player. Trong trường hợp này, bạn có thể muốn xác định hàm như sau:

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

Ngoài ra, khi bạn gọi một hàm, bạn cũng đang truyền một đối số bổ sung bên dưới, đối số này xác định giá trị của thisbên trong hàm. Trong trường hợp trên, vì makeGamePlayerkhông được gọi là một phương thức,this giá trị sẽ là đối tượng toàn cục ở chế độ cẩu thả hoặc không được xác định trong chế độ nghiêm ngặt.

Là hàm tạo, bạn có thể sử dụng newtoán tử để khởi tạo chúng. Toán tử này sử dụng phương thức nội bộ [[Construct]] (chỉ có sẵn trong các hàm tạo), thực hiện một số công việc như sau:

  1. Tạo một đối tượng mới kế thừa từ .prototype hàm tạo
  2. Gọi hàm tạo truyền đối tượng này là this giá trị
  3. Nó trả về giá trị được trả về bởi hàm tạo nếu đó là một đố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 một phiên bản của GamePlayervà lưu trữ giá trị trả về trong biến player. Trong trường hợp này, bạn có thể muốn xác định hàm như sau:

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 của hàm tạo bắt đầu bằng một chữ cái viết hoa.

Ưu điểm của việc sử dụng các hàm tạo là các thể hiện kế thừa từ GamePlayer.prototype. Sau đó, bạn có thể xác định các thuộc tính ở đó và cung cấp chúng trong mọi trường hợp


4
@OP cũng lưu ý rằng khi bạn đang đi để gọi nó với các newtừ khóa tôi sẽ đề nghị bắt đầu tên với số vốn: MakeGamePlayer.
PeeHaa

3
@PeeHaa Lời khuyên tốt, quy ước đặt tên điển hình hơn khi sử dụng hàm tạo sẽ là new GamePlayer().
Matt Zeunert

@RobG Cảm ơn, đó là điều xảy ra khi tôi sao chép-dán mã mà không xem xét kỹ.
Oriol

47

Bạn có thể đơn giản làm điều đó như thế này với một đối tượng theo nghĩa đen :

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

3
xin chào, làm thế nào bạn có thể truy cập các thuộc tính lại, Khi tôi sử dụng makeGamePlayer.name nó không làm việc
iKamy

1
var player1 = makeGamePlayer ("Bobby Fischer", 15, 5); player1.name;
mrturtle

5

Cả hai phong cách, với một chút tinh chỉnh, sẽ hoạt động.

Phương pháp đầu tiên sử dụng một Javascript Constructor, giống như hầu hết mọi thứ đều có ưu 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
  };
}

Được gọi là "tiết lộ mô-đun mô hình" Nhưng nó thường được gói vào đóng cửa tư nhân (function () {return {}}) ()
Felipe Quirós

3

Cách mới nhất để thực hiện việc này với ES2016 JavaScript

let makeGamePlayer = (name, totalScore, gamesPlayed) => ({
    name,
    totalScore,
    gamesPlayed
})

2

Tôi thực hiện 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?
Alex G

@AlexG bắt rất hay, không thể tin được là 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. Đó chắc chắn là một công việc cắt-dán tồi tệ đối với vật thể ban đầu của OP mà tôi và nó trông giống như một vài người khác đã thực hiện.
scrappedcola
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.