2012-11-12 14 views
14

W książce Douglasa Crockforda "Javascript: The Good Parts" wymienia Specyfikatory obiektów w przekazywanych wartościach do nowego obiektu. Zasadniczo, zamiast przekazywania parametrów do funkcji w określonym porządku, sugeruje on, przekazując obiekt z parametrami zawartymi wewnątrz, tak jak poniżej:Specyfikatory obiektów w JavaScript

var myObject = someFunction({a: 1, b: 2, c: 3}); 

Co nie jest wyjaśnione, jednak to, jak radzić sobie z tych parametrów po przeszli przez to. Zamiast robić co następuje ustanowienia wartości domyślne:

function someFunction(params){ 
    this.a = params.a || 0; 
    this.b = params.b || 0; 
    ... 
} 

Co znajduje się w inny sposób obsłużyć dużą ilość parametrów, nie będąc tak gadatliwy?


EDIT: Patrząc na poniższych odpowiedzi, korzystanie z pętli for-in jest świetnym rozwiązaniem. Jaki jest inny sposób, aby to zrobić podczas ustawiania różnych wartości domyślnych dla każdej właściwości? Czy istnieje sposób na utworzenie obiektu o różnych wartościach domyślnych i porównanie z tym?

+0

Możesz mieć "standardy" - obiekt, w którym porównujesz dane wejściowe z jakimś rodzajem pętli. Sposób, w jaki wtyczki jQuery zwykle to obsługują (to jest używanie jQuery) również może być interesujący: http://docs.jquery.com/Plugins/Authoring#Defaults_and_Options – m90

+0

Pamiętaj, że wykonywanie parametrów jeden po drugim pozwala ci określić wartości domyślne indywidualnie (domyślny obiekt, który sugeruje m90 również to pozwala), lub w inny sposób podjąć specjalne działanie, jeśli pewne parametry nie są dostarczane. – nnnnnn

+0

m90 & nnnnnn: Zaktualizowałem moje pytanie, aby uwzględnić różne wartości domyślne, jeśli zechcesz zilustrować odpowiedź. – opes

Odpowiedz

8

Zwykle odbywa się za pomocą defaults przedmiot, z którego skopiować właściwości, jeżeli nie są one istniejące w parametrach. Ten obiekt może być prywatny lub publicznie dostępny do konfiguracji.

var defaults = { a:null, b:1, ...}; 
function someFunction(params) { 
    for (var prop in defaults) 
     if (prop in params) 
      this[prop] = params[prop]; 
     else 
      this[prop] = defaults[prop]; 
} 

lub

function someFunction(custom) { 
    var params = { a:null, b:1, ...}; 
    for (var prop in custom) 
     params[prop] = custom[prop]; 
    // now use params 
} 

Czasami również custom/params przedmioty, które są przekazywane do funkcji przedłuża się, ale potem w docs należy wspomnieć wyraźnie, że obiekt może się modyfikowany:

var defaults = { a:null, b:1, ...}; 
function someFunction(params) { 
    // modifies params object! 
    for (var prop in defaults) 
     if (! (prop in params)) 
      params[prop] = defaults[prop]; 
    // now use params 
} 

Jeśli używasz biblioteki z funkcją extend, często możesz skrócić tę inicjalizację do

var params = $.extend({}, defaults, custom); 
    // create an empty object, copy the defaults, and overwrite with custom properties 
+0

To zdecydowanie wydaje się być najczystszym rozwiązaniem dla mojego pytania. Właśnie tego szukałem. – opes

1

Przeprowadź pętlę przez pola w obiekcie przekazanym jako parametr, tworząc każde pole jako pole na tym obiekcie.

function someFunction(params){ 
    for(x in params){ 
    this[x] = params[x]; 
    } 
} 

Przykład pracy: http://jsfiddle.net/59kzD/

4

Jak o użyciu pętli za-in

function someFunction(params){ 

    for(var key in params){ 
     if(params.hasOwnProperty(key){ 
      var def = null; 
      if(key == 'a' || key == 'b'){ 
       def = 10; 
      } 
      if(key == 'c' || key == 'd'){ 
       def = undefined; 
      } 
      this[key] = params[key] || def ; 
     } 
    } 
} 
+0

Zauważalne;) Myślę jednak, że należy zwrócić uwagę, że spowoduje to jedynie płytką kopię. Ale to może być potrzebne. – Yoshi

+0

To jest świetna odpowiedź na moje pierwsze pytanie. Jeśli chcesz go edytować, aby uwzględnić różne wartości domyślne, byłbym bardzo wdzięczny. – opes

+0

@sprawl .. Co masz na myśli przez różne domyślne wartości? –

0

Rozszerzanie odpowiedź przez Bergi: var params = $.extend({}, defaults, custom);

Możemy teraz używać Object.assign({}, defaults, custom) w ES6 bez biblioteki.

Powiązane problemy