Jak odmówić stworzenia objektu?

0

Witam
Czy jest możliwość stworzenia warunku wewnątrz objektu i gdy nie jest spełniony to odmówić jego utworzenia?
Walczę z objektowym bo może tego potrzebuję (duża ilość podobnych elementów) choć może powinienem użyć jakiś tablic, ale chcę się w końcu przełamać i zacząć używać obiektów.

Pozdrawiam
Radosław Głębicki

1

Do zapoznania się z tematem Design Patterns
Factory, Proxy, Prototype?

2

Powiedz coś więcej, bo nie wiadomo, co właściwie chcesz osiągnąć.

A odpowiadając na samo pytanie:

class Klasa {
  constructor() {
    ....
    throw new Error('Nie!');
    ....
  }
}
0

Nawet nie wiem jak przykład napisać. Słownie: wewnątrz Klasa jest zmienna=1, wewnątrz jest funkcja losująca w przedziale 0 do 2 (0,1,2) Jeśli wylosuje 1 to nie można utworzyć takiego obiektu.
No efekt ja widzę jako:
Tablica = [];
NowyObiekt = new Klasa;
if NowyObiekt rózny od NULL to
Tablica.push(NowyObiekt)

Coś w tym stylu. To NULL to np NowyObiekt.coś z wewnąrz klasy ustawione na NULL bo wylosowano 1?
Takie cósik wymęczyłem:

var aTab=[];

function f_rand() {
	nRand=Math.floor(Math.random()*3);
	return nRand;
}

function person() {
	this.nLos=f_rand();
	};

for(let i=0;i<15;i++) {
	let oNew=new person();
	if(oNew.nLos!=1) {aTab.push(oNew)};
	}

console.log(aTab);

Tylko, że funkcja losująca jest poza obiektem. I nawet nie jestem pewien czy to jest obiektowe.

0

Klasa nie powinna nadzorować własnego procesu tworzenia.

function populateArrayRandomly(array) {
  const los = f_rand();
  if (los === 1) {
    const obj = new person(los);
    array.push(obj);
  }
}

Przynajmniej tak opierając się na tym, co wrzuciłeś, ale to jest raczej kiepski design. No i ta notacja węgierska...

0

No teraz widzę, że nie dałem elementu który mnie interesuje.

var aTab=[];

function person() {
	function f_rand() {
		nRand=Math.floor(Math.random()*21);
		return nRand;}
// ---------------------------
	this.aVal=[7,13]; // <<<<<<<<<<<<< Lista wykluczeń
	this.nLos=f_rand();
}

for(let i=0;i<15;i++) {
	let oNew=new person();
	if(!oNew.aVal.includes(oNew.nLos)) { // sprawdza czy jest w liście, neguje i dodaje to tablicy zatwierdzonych elementów(obiektów)
             aTab.push(oNew)};
	}
console.log(aTab);

Jak to zbudować prawdziwie obiektowo?

2

Jak masz jakieś losowe dane, to lepiej je losować poza obiektem. Jeśli obiekt potrzebuje do czegoś losowe dane, to lepiej je podawać do obiektu np. w konstruktorze. Zakładając, że to są jednorazowe dane. Co innego, jeśli obiekt ma się zachowywać losowo. Wtedy faktycznie mógłby sobie coś losować. Ale jeśli nie, to po co komplikować sytuację? Losowe dane są tricky (np. gorzej się testuje, są nieprzewidywalne itp.). Więc lepiej nie wrzucać tego bez potrzeby do obiektów.

Więc mógłbyś zrobić tak

function person(nLos) {
..... // konstruktor 
}

for(let i=0;i<15;i++) {
   const nLos =  Math.floor(Math.random()*21);

   if(!aTab.find(o => o.nLos == nLos)) {  // uwaga, zmieniłem tablicę na aTab. Nie wiem, czy o to chodziło
        aTab.push(oNew(nLos)};
   }

}

co do if(!oNew.aVal.includes(oNew.nLos)), to nie wiem, co chcesz osiągnąć. Czemu ta tablica jest w obiekcie? Czy tam mają być tylko liczby [7,13] czy coś więcej? Ja założyłem, że chodziło ci o to, żeby obiekty się nie powtarzały względem nLos (więc dlatego w kodzie wyżej dałem aTab.find, ale nie wiem, czy o to ci chodziło). Aha zmieniłem includes na find, żeby przelecieć przez obiekty i sprawdzić czy jakiś nie zawiera właściwości nLos. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Aha, przejrzyj odpowiedzi w tym wątku, bo może twój problem jest podobny:
Przypsianie kilku zmiennym wartości z tablicy

Poza tym uwagi co do stylu:

  • formatowanie ci się rozwaliło (przynajmniej tutaj na forum)
  • konstruktory w JS (oraz klasy w ES6) zwyczajowo się pisze wielką literą czyli Person a nie person.
  • zmienne profesjonalnie się pisze po angielsku wszystkie
  • notacja węgierska w JS to raczej coś bardzo niespotykanego, więc lepiej tego nie stosować, jeśli chcesz, żeby jakikolwiek inny programista JS rozumiał twój kod ;) pewnie nawet nie zakuma, że to jakaś notacja węgierska (chyba, że to programista WebGL, który takiej używa w shaderach).

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