2014-04-24 11 views
9

Mam funkcję, message, która przyjmuje jeden parametr do zdefiniowania typu wiadomości, a następnie dołącza do innych argumentów, aby utworzyć wiadomość, czysto miłe.Dodaj argument do argumentów następnie zastosuj

Wygląda to tak:

function message(type) { 
    var msg = _.rest(arguments).join(" "); 

    // Really the type will be used to set the class on a div 
    // But I'm just using console.log to keep it simple for now. 
    console.log(type + ": " + msg); 
} 

Chcę zapewnić funkcji pomocniczych, error, warning, info, które wystarczy zadzwonić message z prawej typu. Nie jestem pewien, jak najlepiej to osiągnąć. Nie mogę wymyślić dwóch sposobów, ale nie jestem pewien, czy zajmuję się tym prawidłowo, czy też mogę zbytnio komplikować rzeczy.

Pierwszy sposób wydaje się nieco zbędny, utwórz nową tablicę zawierającą pierwszy argument i argumenty, a następnie spłaszcz ją.

message.apply(this, _.flatten(["error", arguments])); 

Drugi sposób wydaje się nieco ... brudny?

Array.prototype.unshift.call(arguments, "error"); 
message.apply(this, arguments); 

Chociaż z mojego experiement:

(function() { 
    Array.prototype.unshift.call(arguments, 0); 
    console,log(arguments); 
})(1, 2, 3); 

pojawia się następujący komunikat:

[0, 1, 2, 3, undefined, undefined, undefined, ..., undefined] 

Odpowiedz

5

W ES5 może to być nieco bardziej wydajne niż converti ng do pierwszego prawdziwego tablicy, a następnie unshift:

var args = Array.prototype.concat.apply(["error"], arguments); 
message.apply(this, args); 

EDIT: Lepiej unikać spłaszczenie tablice wejściowe:

var args = ["error"]; 
args.push.apply(args, arguments); 
message.apply(this, args); 
+1

Zachowaj ostrożność używając tego, tak jakby elementy 'argumentów' były tablicami, które będą" spłaszczone "w tablicy, zamiast być dodawane jako sam element. na przykład 'var args = Array.prototype.concat.apply ([" błąd "], [" jabłko "," banan ", [" marchew "," wiśnia "]])" niepoprawnie staje się "args = [" błąd ", "jabłko", "banan", "marchewka", "wiśnia"] ". – samthecodingman

Powiązane problemy