• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Object.defineProperty() - powtórzenia? (gettery) OOP

+1 głos
76 wizyt
pytanie zadane 13 listopada 2016 w JavaScript, jQuery, AJAX przez iozeke Obywatel (1,800 p.)

Cześć. W moim kodzie muszę bardzo często powtarzać tę instrukcję:

 

Object.defineProperty(this, "ukrytaZmienna", {
   get: function(){return ukrytaZmienna}
  });

 

Czy jest jakiś sposób, aby uniknąć powtórzeń?

 

var Human = function(){
  var ukrytaZmienna = "ukryta wiadomość";
  var ukrytaZmienna2 = true;
  var ukrytaZmienna3 = 512;

  Object.defineProperty(this, "ukrytaZmienna", {
    get: function(){return ukrytaZmienna}
  });

  Object.defineProperty(this, "ukrytaZmienna2", {
    get: function(){return ukrytaZmienna2}
  });

  Object.defineProperty(this, "ukrytaZmienna3", {
    get: function(){return ukrytaZmienna3}
  });
};

 

2 odpowiedzi

0 głosów
odpowiedź 13 listopada 2016 przez Krzycho92 Maniak (64,510 p.)

Może zrób sobie funkcję, która będzie Ci zwracać utworzone już propertisy o określonej nazwie?

function propertiesFactory( propertyName ) {
    return Object.defineProperty(this, propertyName, {
        get: function(){return propertyName}
    });
}

propertiesFactory( 'ukrytaZmienna_N' );

W razie problemów z this, próbuj albo arrow function albo Function.prototype.call()

0 głosów
odpowiedź 13 listopada 2016 przez Comandeer Mentor (364,900 p.)
Ok… A po co Ci taka dziwaczna konstrukcja zamiast normalnego konstruktora?
komentarz 13 listopada 2016 przez iozeke Obywatel (1,800 p.)
Nie rozumiem. Konstruktor jest jak najbardziej normalny..
2
komentarz 13 listopada 2016 przez Comandeer Mentor (364,900 p.)

Nie jest. Normalny konstruktor wygląda tak:

var Human = function() {
	this.ukrytaZmienna = "ukryta wiadomość";
	this.ukrytaZmienna2 = true;
	this.ukrytaZmienna3 = 512;
};

A jak chcesz się tak bawić i potrzebujesz niemutowalnych własności, to można zrobić to tak:

var Human = function(){
	var ukrytaZmienna = "ukryta wiadomość";
	var ukrytaZmienna2 = true;
	var ukrytaZmienna3 = 512;

	return {
		get ukrytaZmienna() {
			return ukrytaZmienna;
		},

		get ukrytaZmienna2() {
			return ukrytaZmienna2;
		},

		get ukrytaZmienna3() {
			return ukrytaZmienna3;
		}
	};
};

A jak ES6 jest opcją, to jest jeszcze proxy:

var Human = function(){
	var props = {
		ukrytaZmienna: "ukryta wiadomość",
		ukrytaZmienna2: true,
		ukrytaZmienna3: 512
	}

	return new Proxy( {}, {
		get( target, property ) {
			if ( Reflect.has( props, property ) ) {
				return Reflect.get( props, property );
			}

			throw new ReferenceError( 'Given property does not exist.' );
		}
	} );
};

 

komentarz 13 listopada 2016 przez iozeke Obywatel (1,800 p.)

Podałeś mi inną metodę definiowania getterów, za co Ci dziękuję :) Nigdzie tego nie znalazłem.

I na przyszłość nie udziwniona, tylko najbardziej prawidłowa, jaką poznałem do tej pory ;)

Podobne pytania

0 głosów
2 odpowiedzi 430 wizyt
pytanie zadane 25 lipca 2015 w PHP, Symfony, Zend przez Aurelian Spodarec Użytkownik (890 p.)
0 głosów
1 odpowiedź 65 wizyt
0 głosów
2 odpowiedzi 96 wizyt
pytanie zadane 8 czerwca w PHP, Symfony, Zend przez Benek Nałogowiec (34,660 p.)
Obowiązuje już zaktualizowany regulamin.

Czy wiesz, że nie musisz już odświeżać strony głównej?

Lista pytań i odpowiedzi aktualizuje się automatycznie!

38,636 zapytań

76,523 odpowiedzi

149,475 komentarzy

18,086 pasjonatów

Przeglądających: 220
Pasjonatów: 12 Gości: 208

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...