Przechowywanie obiektów w Local Storage

0

Cześć

Zacznę od konkretów, czyli od kodu:

<script type="text/javascript">
                // Mam sobie taki obiekt:		
                function Person(name, surname){
			this.name = name;
			this.surname = surname;
		}

		// sayMyName dla każdej instancji Person
                Person.prototype.sayMyName = function(){
			alert("My name is: " + this.name + " " + this.surname);
		}
		// Zapis obiektu do local storage
		function saveObject(name, surname){
			var radek = new Person (name, surname);
			window.localStorage.setItem("someone", JSON.stringify(radek));
		}
		// odczyt obiektu
		function getObject(){
			var someoneStr = window.localStorage.getItem("someone");
			var someone = JSON.parse(someoneStr);
                        // Ta metoda oczywiscie nie zadziala gdyz sparsowany obiekt jej nie posiada
			someone.sayMyName();

// mozna to brzydko objesc robiąc nowy obiekt Person na podstawie someone i na tym nowym obiekcie wywolac metode, ale to rozwiazanie mi sie nie podoba... Macie jakies inne sugestie jak przechowac obiekt tak, aby po jego pobraniu z LS moc wywolac na nim metode skladowa?
			
		}
		
		function makeAction(){
			var name = document.getElementById('myName').value;
			var surname = document.getElementById('mySurname').value;
			
			saveObject(name, surname);
			getObject();
		}
</script>
// cos tam dalej...

Pytanie jak w komentarzu

Dzięki

0

Zupełnie OK byłoby utworzenie metody wytwórczej na obiekcie (funkcji) Person, czyli utworzenie takiej jakby "funkcji statycznej". Mógłbyś ją nazwać np. fromJSON() lub createFromJSON() lub coś w tym stylu.

Używałbyś tego tak:

var myPerson = Person.fromJSON(someoneStr);

A zaimplementować funkcję .fromJSON() mógłbyś na wiele różnych sposobów. Dedykowany pod Person, bardzo prosty w implementacji:

Person.fromJSON = function(jsonString) {
  var personData = JSON.parse(jsonString);
  return new Person(personData.name, personData.surname);
};

Jeśli masz wiele takich przypadków, to możesz napisać funkcję, która będzie pobierała za parametr dwa argumenty:
-jsonString: string JSON z danymi odpowiadającymi polom obiektu
-constructor: konstruktor, który podpowie, jakie metody ma dziedziczyć nowo utworzony obiekt.
Funkcja wykona następujące kroki:

  1. Utworzy nowy obiekt o prototypie wskazywanym przez constructor. Konstruktor nie otrzyma ŻADNYCH parametrów, więc użytkownicy naszej funkcji będą musieli zagwarantować, że takie odpalenie konstruktora jest dopuszczalne.
  2. Umieści na nowo utworzonym obiekcie wszystkie własności podanego JSON-a.

Implementacja dość sprytnie (?) wykorzystująca drugi argument JSON.parse():

JSON.parseAndConstruct = function(jsonString, constructor) {
  var instance = new constructor();
  JSON.parse(jsonString, function(propertyName, propertyValue) {
    instance[propertyName] = propertyValue;
  });
  return instance;
};

Ja bym tu jeszcze dorzucił obsługę błędów (jeśli JSON.parse() nie da rady) i zastanowiłbym się nad zmianą wywołania new construct() na Object.create(construct.prototype) żeby konstruktor nie był wywoływany.

W każdym razie, możesz użyć tego tak:

var someone = JSON.parseAndConstruct(someoneStr, Person);
someone.sayMyName();

1 użytkowników online, w tym zalogowanych: 0, gości: 1