JavaScript: bir nesneyi döndüren işlev


90

Codecademy.com'da JavaScript / jQuery dersleri alıyorum. Normalde dersler cevaplar veya ipuçları sağlar, ancak bunun için herhangi bir yardım sağlamaz ve talimatlar beni biraz karıştırır.

MakeGamePlayer işlevinin üç tuşlu bir nesne döndürmesini sağlar.

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

Bunu yapmalı mıyım emin değilim

//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;
}

veya bunun gibi bir şey

 //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;
          }
    }

Oluşturulduktan sonra nesnenin özelliklerini değiştirebilmem gerekiyor.

Yanıtlar:


145

JavaScript'te çoğu işlev hem çağrılabilir hem de başlatılabilirdir: hem [[Call]] hem de [[Construct]] dahili yöntemleri vardır.

Çağrılabilir nesneler olarak, isteğe bağlı olarak bazı argümanlar ileterek onları çağırmak için parantez kullanabilirsiniz. Çağrının bir sonucu olarak, işlev bir değer döndürebilir .

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

Yukarıdaki kod işlevi çağırır makeGamePlayerve döndürülen değeri değişkende saklar player. Bu durumda, işlevi şu şekilde tanımlamak isteyebilirsiniz:

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

Ek olarak, bir işlevi çağırdığınızda, kaputun altına thisişlevin içindeki değeri belirleyen ek bir argüman da iletmiş olursunuz . Yukarıdaki durumda, makeGamePlayerbir yöntem olarak adlandırılmadığından,this değer özensiz moddaki global nesne veya katı modda tanımsız olacaktır.

Yapıcılar olarak, onları başlatmak için newoperatörü kullanabilirsiniz . Bu operatör [[Construct]] dahili yöntemini kullanır (yalnızca yapıcılarda mevcuttur), bu şu şekilde bir şey yapar:

  1. Devralan yeni bir nesne oluşturur .prototypeyapıcısının
  2. thisDeğer olarak bu nesneyi geçiren kurucuyu çağırır
  3. Bir nesneyse kurucu tarafından döndürülen değeri veya aksi takdirde 1. adımda oluşturulan nesneyi döndürür.
var player = new GamePlayer("John Smith", 15, 3);

Yukarıdaki kod bir örnek oluşturur GamePlayerve döndürülen değeri değişkende saklar player. Bu durumda, işlevi şu şekilde tanımlamak isteyebilirsiniz:

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
}

Kural olarak, kurucu adları büyük harfle başlar.

Oluşturucuları kullanmanın avantajı, örneklerin miras almasıdır GamePlayer.prototype. Ardından, burada özellikleri tanımlayabilir ve bunları tüm durumlarda kullanılabilir hale getirebilirsiniz.


4
@OP ayrıca bunu çağırmak için hareket ederken bunu unutmayın newanahtar kelime ben bir sermaye ile adını başlayan öneririm: MakeGamePlayer.
PeeHaa

3
@PeeHaa İyi bir tavsiye, ayrıca yapıcıyı kullanırken daha tipik adlandırma kuralı olurdu new GamePlayer().
Matt Zeunert 04

@RobG Teşekkürler, derinlemesine bakmadan kodu kopyalayıp yapıştırdığımda böyle oluyor.
Oriol

48

Bunu basitçe bir nesne değişmeziyle yapabilirsiniz :

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

3
merhaba, dönüş özelliklerine nasıl erişebilirsiniz, makeGamePlayer.name kullandığımda çalışmıyor
iKamy

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

5

Her iki stil de ince bir dokunuşla işe yarayacaktı.

İlk yöntem, çoğu şey gibi artıları ve eksileri olan bir Javascript Oluşturucu kullanır.

 // 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);

Öte yandan, doğru hatırlıyorsam diğer yönteminiz 'Kapanış Modelini Açığa Çıkarmak' olarak adlandırılır.

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

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

"Gösterge modülü kalıbı" olarak adlandırılır, ancak genellikle özel kapanışa sarılır (function () {return {}}) ()
Felipe Quirós

3

Bunu ES2016 JavaScript ile yapmanın en son yolu

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

2

Bu talimatları şu anlama gelmek için alırdım:

  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
Nesnenin içinde neden noktalı virgül var?
Alex G

@AlexG güzel yakaladı, bu cevabı ilk gönderdiğimden bu yana 4 yılda kimsenin yapmadığına inanamıyorum. Şüphesiz, OP'nin orijinal nesnesinin kötü bir kes-yapıştır işiydi ve birkaç tane daha yapılmış gibi görünüyor.
scrappedcola
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.