Załóżmy, że tworzysz typ danych i ujawniasz ich zachowanie.JavaScript: jakie są wytyczne dotyczące definiowania nowych typów danych?
można podać kilka przykładów, kiedy należałoby użyć:
funkcję & nowy:
// define new data type var CustomDataType= function(){ this.a='whatever'; this.doX= function(){/*some code*/}; } // create a new instance of our custom data type var obj= new customDataType();
obiekt dosłowne & Object.create:
// define new data type var customDataType = { a: 'whatever', doX: function(){/*some code*/} } // create a new instance of our custom data type var obj= Object.create(customDataType);
Funkcja, która Cię buduje R obiektu:
function customDataTypeFactory(options){ return { a: 'whatever', doX: function(){/*some code*/} } }; // create a new instance of our custom data type var obj= customDataTypeFactory(options);
czuję, że to może być oznaczony duplikat dla: new
vs Object.create
ale moim głównym celem nie jest w dyskusji, który z nich jest lepszy, ale raczej wiedzieć, czy istnieją szczególne przypadki użycia, gdzie trzeba być preferowanym w stosunku do innych.
Przeczytałem wiele postów na podobne pytania i książkę z Crockford: JavaScript: dobre części. Do tej pory doszedłem do wniosku, że jest to kwestia preferencji, ale twarde rady od Crockford wiele mi mówią: "staram się unikać funkcji, które są niebezpieczne i niepotrzebne" ... mówię o new
.
Twoje pierwsze i trzecie wersje umieszczają właściwości bezpośrednio na nowym obiekcie. W drugiej wersji obiekt dziedziczy właściwości. Nie wiem, czy jest jakaś konkretna odpowiedź na twoje pytanie. Pierwszy używa konstruktora, jeśli wywołasz używając 'new', a' instanceof' będzie działać, aby zidentyfikować ten obiekt.Trzeci nie wymaga użycia 'new', ale' instanceof' nie będzie tak użyteczny. Drugi ponownie dziedziczy właściwości, więc budowanie wielu obiektów w ten sposób będzie współużytkować dane, a wszystkie obiekty będą obserwować aktualizacje odziedziczonego obiektu. –
... i nie daj się zbytnio powiesić na ostrzeżeniach o niebezpieczeństwie Crockforda. Myślę, że trochę się martwi. Rozumiem, weź to wszystko, ale weź to z przymrużeniem oka. –
'this.doX =' powinno być 'doX:' w dwóch ostatnich urywkach –