Czytałem, że zamiast pisać kilka funkcji, powinienem używać literału obiektowego.JavaScript - Zalety literału obiektu
Czy ktoś może wyjaśnić, jakie są zalety literału obiektu z przykładami, ponieważ nie rozumiem do tej pory.
Dzięki
Czytałem, że zamiast pisać kilka funkcji, powinienem używać literału obiektowego.JavaScript - Zalety literału obiektu
Czy ktoś może wyjaśnić, jakie są zalety literału obiektu z przykładami, ponieważ nie rozumiem do tej pory.
Dzięki
Jak powiedział Russ Cam, unikać zanieczyszczenia globalnej przestrzeni nazw, co jest bardzo ważne w tych dniach łączenia skryptów z wielu miejsc (TinyMCE, etc.).
Jak powiedział Alex Sexton, zapewnia to również dobrą organizację kodu.
Jeśli używasz tej techniki, sugeruję użycie wzorca modułu. To nadal wykorzystuje literały obiektowe, ale jako wartość zwracana z funkcji określania zakresu:
var MyThingy = (function() {
function doSomethingCool() {
...
}
function internalSomething() {
....
}
function anotherNiftyThing() {
// Note that within the scoping function, functions can
// call each other direct.
doSomethingCool();
internalSomething();
}
return {
doSomethingCool: doSomethingCool,
anotherNiftyThing: anotherNiftyThing
};
})();
użytku zewnętrznego:
MyThingy.doSomethingCool();
Funkcja określania zakresu jest owinięty wokół wszystkich swoich funkcji, a następnie wywołać ją natychmiast i zapisz jego wartość zwracaną. Zalety:
{name: function() { ... }}
wszystkie funkcje są anonimowe, nawet jeśli właściwości, które się do nich odwołują, mają nazwy.) Narzędzia pomocy nazw pomagają, od pokazywania stosów wywołań w debugerze, po informowanie użytkownika o funkcji, która spowodowała wyjątek. (Aktualizacja 2015: Najnowsza specyfikacja JavaScript, ECMAScript 6th edition, definiuje wiele sposobów, w jakie silnik JavaScript musi mieć wywodzić nazwę funkcji.Jednym z nich jest, gdy funkcja jest przypisana do właściwości, jak w naszym przykładzie {name: function() { ... }}
. silników ES6, ten powód zniknie.)internalSomething
powyżej). Żaden inny kod na stronie nie może wywoływać tych funkcji; są naprawdę prywatne. Tylko te, które eksportujesz na końcu, w instrukcji return, są widoczne poza funkcją scoping.Przykład powrotu różne funkcje:
var MyUtils = (function() {
function hookViaAttach(element, eventName, handler) {
element.attachEvent('on' + eventName, handler);
}
function hookViaListener(element, eventName, handler) {
element.addEventListener(eventName, handler, false);
}
return {
hook: window.attachEvent ? hookViaAttach : hookViaListener
};
})();
MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */);
Korzystanie przedmiotu dosłowne (aka literał obiektu wzór) nie będzie zanieczyszczać globalnej przestrzeni nazw, jak surowo, jak przy użyciu wielu funkcji zadeklarowane globalnie będzie, a także przyczynia się do organizowania kodu w logiczny sposób
Dla Przykład ten obiekt dosłownym
var obj = {
find : function(elem) { /* find code */ },
doSomething: function() { /* doSomething code */ },
doSomethingElse: function() { /* doSomethingElse code */ }
}
porównaniu
function find(elem) { /* find code */ },
function doSomething() { /* doSomething code */ },
function doSomethingElse() { /* doSomethingElse code */ }
utworzy tylko jedną właściwość obiektu globalnego w porównaniu do trzech. Następnie można łatwo korzystać z funkcji takich jak tak
obj.doSomething();
można napisać wiele funkcji w normalnej funkcji i nie zanieczyszczać kodu. literał obiektowy nie daje żadnej wartości dodanej. Ja sam używam metody prototypowej. – vsync
Rebecca Murphey nie rozmowa na literale obiektów na tegorocznej konferencji jQuery. Jednym z najlepszych powodów ich używania jest po prostu dobra organizacja kodu.
Oto zapis Rebeki się na literał obiektu Wzór: http://rmurphey.com/blog/2009/10/15/using-objects-to-organize-your-code/
Kolejny świetny artykuł o literaturze przedmiotu: http://www.wait-till-i.com/2006/02/16/show-love-to-the-object-literal/ –
Ive zawsze literały obiektu, ponieważ są one oczywiste sposób organizowania kodu. Dlatego nie lubię prototypu, jest zbyt brudny.
Funkcje nie ignoruj przestrzeni nazw, jak wspomniano powyżej, poza literałami obiektów.
Można łatwo napisać dosłownym jak
var obj = {}
var find = function(elem) { /* find code */ },
var doSomething = function() { /* doSomething code */ },
var doSomethingElse = function() { /* doSomethingElse code */ }
które polute tworząc wiele globalnych obiektów samo takie same jak funkcje. Podobnie można zrobić:
(function() {
function find(elem) { /* find code */ },
function doSomething() { /* doSomething code */ },
function doSomethingElse() { /* doSomethingElse code */ }
})();
która nie powodowałaby tych obiektów globalnych (wszystko jest obiekt w JS)
tamtędy jeszcze nie stwarzają mnóstwo obiektów globalnych.
Moim zdaniem literały obiektowe mają dwie zalety. Jeden z nich jest używany przez wiele wtyczek, takich jak jQuery, więc ludzie są rodzinni i łatwo je odczytać. Ułatwienie przesyłania danych do wtyczki. Łatwo jest tworzyć metody publiczne i prywatne ...
Mogą one być powolne, ponieważ za każdym razem, gdy tworzysz instancję obiektu, wszystkie jego metody są duplikowane. Rozumiem, że nie ma to miejsca w przypadku prototypu, ponieważ dysponujesz jedną kopią metod, a nowe projekty odwołują się do prototypu.
Mogę się mylić oczywiście ...
Literały obiektowe są dobre dla przestrzeni nazw i pojedynczych obiektów, gdy tworzy się wiele wystąpień obiektu z zachowaniem dzielonym, lepiej byłoby użyć funkcji konstruktora. Nie znalazłem przypadek użycia, w którym zużywa więcej procesora i pamięci przez symulowanie osób korzystających z '_myPrivate' dla klientów indywidualnych, ale byłby szczęśliwy, gdyby ktoś mógł mi go zapewnić. Więcej o prototypie, dziedziczeniu, mieszaniu ins tutaj: http://stackoverflow.com/a/16063711/1641941 – HMR
Kiedy tworzysz funkcję w sposób "anonimowy", wciąż możesz nadać jej nazwę (var x = function x() {...}). Gdy to zrobisz, nazwa jest związana tak, że jest dostępna dla rekurencyjnych odniesień w funkcji. – Pointy
@Pointy: Nie możesz tego zrobić (użyj nazwy funkcji w ramach przypisania) w różnych przeglądarkach, to nie działa poprawnie na IE ani Safari; details: http://yura.thinkweb2.com/named-function-expressions/ A ty nie musisz, właściwa nazwa funkcji ('foo' w' funkcja foo') jest w zasięgu w całym zakresie gdzie jest zadeklarowane, włączając w to samą funkcję, więc 'foo' może wywoływać się za pomocą symbolu' foo', nie ma potrzeby przypisywania odniesienia do funkcji do niczego (w tym momencie). –
(Kontynuacja) Przyznanie, że byłoby dobrze * mieć możliwość używania zarówno przypisania, jak i nazwy własnej w tym samym czasie, ponieważ ułatwiłoby to eksportowanie funkcji z funkcji scoping. Specyfikacja na pewno pozwala na to, ale niestety, praktyczne (błędy implementacji) wchodzą w to. –