• 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
66 wizyt
pytanie zadane 13 listopada 2016 w JavaScript, jQuery, AJAX przez użytkownika iozeke Obywatel (1,800 punkty)

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 użytkownika Krzycho92 Maniak (55,490 punkty)

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 użytkownika Comandeer Ekspert (332,300 punkty)
Ok… A po co Ci taka dziwaczna konstrukcja zamiast normalnego konstruktora?
komentarz 13 listopada 2016 przez użytkownika iozeke Obywatel (1,800 punkty)
Nie rozumiem. Konstruktor jest jak najbardziej normalny..
2
komentarz 13 listopada 2016 przez użytkownika Comandeer Ekspert (332,300 punkty)

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 użytkownika iozeke Obywatel (1,800 punkty)

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 399 wizyt
pytanie zadane 25 lipca 2015 w PHP, Symfony, Zend przez użytkownika Aurelian Spodarec Użytkownik (890 punkty)
0 głosów
2 odpowiedzi 101 wizyt
pytanie zadane 29 stycznia w PHP, Symfony, Zend przez użytkownika chmod Mądrala (5,690 punkty)
+1 głos
3 odpowiedzi 158 wizyt
pytanie zadane 21 czerwca 2016 w PHP, Symfony, Zend przez użytkownika Malolacik De Nowicjusz (190 punkty)
...