JavaScript integrētie konstruktori /Constructors

 

Konstruktori

JavaScript ir vairāki iebūvēti objektu veidi, piemēram:

 MathDateObjectFunctionBooleanSymbolArrayMapSetPromiseJSON, utt.

Šos objektus dažreiz dēvē par “vietējiem objektiem”. (local objects)

Konstruktora funkcijas, ko parasti dēvē tikai par “konstruktoriem”, ir īpašas funkcijas, kas ļauj mums izveidot šo iebūvēto vietējo objektu gadījumus. Visi konstruktori ir rakstāmi ar lielo sākuma burtu.

Lai izmantotu konstruktora funkciju, man tā ir jāpievieno operatoram new.

Piemēram, lai izveidotu jaunu Datuma objekta gadījumu, es varu palaist: new Date(). Es saņemu pašreizējo datumu un laiku, piemēram:

Ceturtdiena, 2022. gada 3. februāris, 11:24:08 GMT+0100 (Centrāleiropas standarta laiks)

Tomēr ne visiem iebūvētajiem objektiem ir konstruktora funkcija. Šāda objekta tipa piemērs ir iebūvētais matemātikas objekts. (Math object)

Palaižot jaunu Math() tiek parādīta nenoķerta tipa kļūda, informējot mūs, ka matemātika nav konstruktors.

Tādējādi es varu secināt, ka dažiem iebūvētiem objektiem ir konstruktori, ja tie kalpo noteiktam mērķim:

ļaut mums izveidot konkrētu objekta konstruktora gadījumu. Iebūvētais Datuma objekts ir lieliski piemērots konstruktoram, jo katrai jaunai datuma objekta instancei, kuru es veidoju, pēc definīcijas ir jābūt unikāliem datiem, jo tam būs atšķirīgs laikspiedols — tas tiks izveidots citā laika brīdī.

Citiem iebūvētiem objektiem, kuriem nav konstruktoru, piemēram, matemātikas objektam, konstruktors nav nepieciešams. Tie ir tikai statiski objekti, kuru īpašībām un metodēm var piekļūt tieši no paša iebūvētā objekta. Citiem vārdiem sakot, nav jēgas izveidot iebūvētā matemātikas objekta eksemplāru, lai varētu izmantot tā funkcionalitāti.

Piemēram, ja es vēlos izmantot matemātikas objekta pow metodi, lai aprēķinātu eksponenciālās vērtības, nav nepieciešams izveidot matemātikas objekta gadījumu, lai to izdarītu. Piemēram, lai skaitli 2 iegūtu pakāpē no 5, es izpildītu:

Math.pow(2,5); // --> 32

Nav nepieciešams izveidot matemātikas objekta gadījumu, jo šī konkrētā objekta instancē nebūtu nekā, kas būtu jāsaglabā.

Bez konstruktora funkcijām iebūvētajiem objektiem varu definēt arī pielāgotas konstruktora funkcijas.

Šeit ir piemērs:

function Saldējums(siltums) {
    this.siltums = siltums;
    this.izkausēt = function() {
        console.log(`Šis ${this.siltums} saldējums ir izkusis`);
    }
}
Tagad es varu pagatavot tik daudz saldējumu, cik vēlos:
function Saldējums(siltums) {
  this.siltums = siltums;
  this.izkausēt = function () {
    console.log(`Šis ${this.flavor} saldējums ir izkusis`);
  };
}


let kiviSaldējums = new Saldējums("kivi");
let āboluSaldējums = new Saldējums("ābols");
kiviSaldējums; // --> Saldējums {siltums: 'kivi', izkausēt: ƒ}
āboluSaldējums; // --> Saldējums {siltums: 'ābols', izkausēt: ƒ}

Es tikko izveidoju divus saldējuma tipa objektus.

Visizplatītākais new izmantošanas gadījums ir to izmantošana ar kādu no iebūvētajiem objektu veidiem.

Ņemiet vērā, ka konstruktora funkciju izmantošana visos iebūvētajos objektos dažkārt nav labākā pieeja.

Tas jo īpaši attiecas uz primitīvu tipu objektu konstruktoriem, proti: string, number un Boolean.

Piemēram, izmantojot iebūvēto String konstruktoru, es varu izveidot jaunas virknes:

let ābols = new String("ābols");
ābols; // --> String {'apple'}

Ābola mainīgais ir String tipa objekts.

Apskatīsim, kā ābola objekts atšķiras no šāda bumbieru mainīgā:

let bumbieris = "bumbieris";
bumbieris; // --> "bumbieris"

Bumbieru mainīgais ir virknes literāls, tā ir, primitīva Javascript vērtība.

Bumbieru mainīgais, kas ir primitīva vērtība, vienmēr būs efektīvāks nekā ābolu mainīgais, kas ir objekts.

Tā kā katrs JavaScript objekts ir unikāls, jūs nevarat salīdzināt virknes objektu ar citu virknes objektu, pat ja to vērtības ir identiskas.

Citiem vārdiem sakot, ja salīdzināsit new String(‘plūme’) === new String(‘plūme’), jūs atgriezīsit vērtību False, savukārt “plūme” === “plūme” atgriež patiesu rezultātu True. Salīdzinot objektus, jūs saņemat kļūdas, jo tiek salīdzinātas nevis vērtības, kuras nododat konstruktoram, bet gan atmiņas vieta, kurā objekti tiek saglabāti.

Papildus tam, ka primitīvu objektu versiju veidošanai neizmantojat konstruktorus, labāk neizmantojiet konstruktorus, veidojot vienkāršus, parastus objektus.

Jaunā objekta vietā jums vajadzētu pieturēties pie objekta literālās sintakses: {}.

RegExp objekts ir vēl viens JavaScript objekts. To izmanto, lai saskaņotu virknes, izmantojot tā sauktās “regulārās izteiksmes”. Regulārās izteiksmes pastāv daudzās valodās, ne tikai JavaScript.

Programmā JavaScript varat izveidot RegExp konstruktora gadījumu, izmantojot jauno RegExp.

Varat arī izmantot burtu rakstu, nevis RegExp. Šeit ir piemērs, kā izmantot /d/ kā burtu rakstu, kas tiek nodots kā arguments atbilstības metodei virknē.

"abcd".match(/d/); // null
"abcd".match(/a/); // ['a', index: 0, input: 'abcd', groups: undefined]

Tā vietā, lai izmantotu konstruktorus Array, Function un RegExp, jums vajadzētu izmantot to masīva literālo, funkciju literālo un šablonu literālo variantu: [], () {} un /()/.

Taču, būvējot cita veida iebūvējamus objektus, varam izmantot konstruktoru.

Šeit ir daži piemēri:

new Date();
new Error();
new Map();
new Promise();
new Set();
new WeakSet();
new WeakMap();

Iepriekš minētais saraksts ir nepārliecinošs, taču tas ir paredzēts, lai sniegtu jums priekšstatu par dažām konstruktora funkcijām, kuras jūs noteikti varat izmantot.

 

Loading

Noderīgs raksts? Dalies ar citiem: