Kurs obiektowego JavaScript (23)

Autor: Damian Chodorek • Opublikowany: 12 października 2014 • Ostatnia aktualizacja: 8 lutego 2015 • Kategoria: javascript, kursy

Wyliczeniowe pola obiektów.

Jak pamiętasz z poprzednich lekcji, do wartości tablicy możesz dostać się przy pomocy pętli for-in. Skoro tablice w pewnym sensie przypominają obiekty, to istnieje możliwość dostania się do kolejnych pól w ten sam sposób.

var ob={ pole1: 1, pole2: 2, pole3: 3 };
for( var idx in ob )
  console.log(idx+" = "+ob[idx]);

Okazuje się, że nie wszystkie pola mogą być wyliczone w pętli. Przykładem jest pole length w tablicach lub pole constructor. Te, które można wyliczyć nazywamy polami wyliczeniowymi (enumerable).

Istnieje specjalna metoda popertyIsEnumerable(), która umożliwia sprawdzenie czy dane pole można wyliczyć. Pola, które obiekt dostanie w prezencie od pola prototype swojego konstruktora, także się pojawią o ile będą wyliczeniowe. Jak sprawdzić czy dane pole należy do danego obiektu czy może jest odziedziczone po konstruktorze? Przy pomocy metody hasOwnProperty().

Uwaga! Metoda popertyIsEnumerable() zwróci false dla wszystkich pól z prototype mimo, że będą one wyliczeniowe.

function Thing(name, color){
  this.name=name;
  this.color=color;
  this.getName=function(){ return this.name; }
}

Thing.prototype.price=100;

var chair=new Thing("chair", "white");

for( var i in chair )
  console.log(i+" = "+chair[i]);  //wyliczenie pól chair, włącznie z price

chair.hasOwnProperty("name"); //true
chair.hasOwnProperty("price"); //false bo price jest w prototype

chair.propertyIsEnumerable('constructor'); //false
chair.propertyIsEnumerable('color'); //true

Metoda isPrototypeOf()

Każdy obiekt w JS posiada także metodę isPrototypeOf(). Przy jej pomocy można sprawdzić czy dany obiekt jest użyty jako prototyp innego obiektu.

function Thing(name, color){
  this.name=name;
  this.color=color;
  this.getName=function(){ return this.name; }
}

var product={ price: 100 }

Thing.prototype=product;

var chair=new Thing("chair", "white");

product.isPrototypeOf(chair); //true

Link __proto__

Każdy obiekt w niektórych przeglądarkach posiada pole __proto__, które odnosi się bezpośrednio do prototypu danego obiektu. Jest to mniej więcej równoważne constructor.prototype. Dlaczego mniej więcej? Ponieważ pole constructor, może być zamienione na inną wartość i nie będzie pokazywać na konstruktor danego obiektu. Mimo to pole __proto__ zwróci poprawny prototyp obiektu.

Warto o tym wiedzieć, ale nie powinieneś korzystać z tego pola, ponieważ nie jest ono implementowane na wszystkich przeglądarkach tak samo.

W tym artykule to wszystko. Przejdź do następnej części:

Kurs obiektowego JavaScript (24)

Zobacz również
Kurs obiektowego JavaScript (21)Mechanizm obsługi błędów.
Kurs obiektowego JavaScript (22)Model programowania oparty o prototyp.
Kurs obiektowego JavaScript (24)Rozszerzanie funkcjonalności obiektów wbudowanych.
Kurs obiektowego JavaScript (25)Wstęp do dziedziczenia w JS.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.