Objekte
Literale Objekte
Literale Definition
// Leeres Objekt
const emptyObject = {};
const ebensoLeer = new Object(); // unüblich
// Objekt mit Properties
const environment = {
browser: true,
agent: 'Chrome',
};// Leeres Objekt
const emptyObject = {};
const ebensoLeer = new Object(); // unüblich
// Objekt mit Properties
const environment = {
browser: true,
agent: 'Chrome',
};Shorthand Properties
const firstname = 'Douglas';
const lastname = 'Crockford';
const person1 = { firstname: firstname, lastname: lastname };
const person2 = { firstname, lastname };const firstname = 'Douglas';
const lastname = 'Crockford';
const person1 = { firstname: firstname, lastname: lastname };
const person2 = { firstname, lastname };Property Zugriff
// Reading
console.log(environment.agent);
console.log(environment['browser']);
// Writing
environment.agent = 'Node.js';
environment['browser'] = false;// Reading
console.log(environment.agent);
console.log(environment['browser']);
// Writing
environment.agent = 'Node.js';
environment['browser'] = false;Dynamische Properties
// Adding
environment.version = 85;
// Removing
delete environment.browser;// Adding
environment.version = 85;
// Removing
delete environment.browser;Methoden
Logik in Objekten
In der OOP können an Objekte Nachrichten gesendet werden, die u.a. den Status/State des Objektes mutieren. In vielen OOP-Sprachen wird dies durch Methoden realisiert.
In JavaScript ist eine Objekt-Eigenschaft, deren Value eine Funktion ist, eine Methode.
const environment = {
browser: true,
agent: 'Chrome',
print: function () {
console.log('Browser-Name: ' + this.browser);
},
};
environment.print();const environment = {
browser: true,
agent: 'Chrome',
print: function () {
console.log('Browser-Name: ' + this.browser);
},
};
environment.print();Die Besonderheit im Methodenrumpf ist das Schlüsselwort this. Dieses referenziert bei der Ausführung als Methode (also über den Objektnamen mit dem Punkt-Operator) das Objekt selbst.
Mit JavaScript 2015 wurde auch eine elegantere Syntax für Methoden-Properties eingeführt:
const environment = {
browser: true,
agent: 'Chrome',
print() {
console.log('Browser-Name: ' + this.browser);
},
};
environment.print();const environment = {
browser: true,
agent: 'Chrome',
print() {
console.log('Browser-Name: ' + this.browser);
},
};
environment.print();Getter/Setter
In ECMAScript 5 wurde die Getter/Setter-Semantik eingeführt. Diese Syntax existierte also schon vor der eleganteren Methodensyntax aus ECMAScript 6 / 2015
const konto = {
_prop: 'I am private'; // Der Unterstrich/Underscore ist nur Kosmetik
_password: 'password';
get prop() { return this._prop; },
get password() { return this._password; },
set password(value) {
if (password.length > 0) {
this._password = value;
}
}
};const konto = {
_prop: 'I am private'; // Der Unterstrich/Underscore ist nur Kosmetik
_password: 'password';
get prop() { return this._prop; },
get password() { return this._password; },
set password(value) {
if (password.length > 0) {
this._password = value;
}
}
};Cloning
const objekt = {
propA: 17,
propB: 'Message',
};const objekt = {
propA: 17,
propB: 'Message',
};Referenzen
const refKopie = objekt;
console.log(objekt);
console.log(refKopie);
objekt.propA = 21;
refKopie.propB = 'Nachricht';
console.log(objekt);
console.log(refKopie);
// Es gilt
console.log(objekt === refKopie); // trueconst refKopie = objekt;
console.log(objekt);
console.log(refKopie);
objekt.propA = 21;
refKopie.propB = 'Nachricht';
console.log(objekt);
console.log(refKopie);
// Es gilt
console.log(objekt === refKopie); // trueManuell Kopieren
const manuelleKopie = {
propA: objekt.propA,
propB: objekt.propB,
};
console.log(objekt);
console.log(manuelleKopie);
objekt.propA = 47;
manuelleKopie.propB = 'New Message';
console.log(objekt);
console.log(manuelleKopie);
// Es gilt
console.log(objekt === manuelleKopie); // falseconst manuelleKopie = {
propA: objekt.propA,
propB: objekt.propB,
};
console.log(objekt);
console.log(manuelleKopie);
objekt.propA = 47;
manuelleKopie.propB = 'New Message';
console.log(objekt);
console.log(manuelleKopie);
// Es gilt
console.log(objekt === manuelleKopie); // falseECMAScript 5: Object.assign
// leeresObjekt enthält nach dem assign-Auruf die kopierten Properties
const leeresObjekt = {};
Object.assign(leeresObjekt, objekt);
// Normale Verwendung
const assignKopie = Object.assign({}, objekt);// leeresObjekt enthält nach dem assign-Auruf die kopierten Properties
const leeresObjekt = {};
Object.assign(leeresObjekt, objekt);
// Normale Verwendung
const assignKopie = Object.assign({}, objekt);ECMAScript 6: Spread
Eingeführt mit JavaScript 2015 und heutzutage Best-Practice.
const kopie = { ...objekt };
const kopieMitChangedProp = { ...objekt, propA: 777 };
const kopieMitNeuerProp = { ...objekt, propC: 0 };
// Der Spread funktioniert auch mit Arrays
const zahlen = [1, 2, 3, 4];
// Old-School Kopie
const zahlenKopieOldSchool = zahlen.slice();
// Spread
const zahlenKopie = [...zahlen];const kopie = { ...objekt };
const kopieMitChangedProp = { ...objekt, propA: 777 };
const kopieMitNeuerProp = { ...objekt, propC: 0 };
// Der Spread funktioniert auch mit Arrays
const zahlen = [1, 2, 3, 4];
// Old-School Kopie
const zahlenKopieOldSchool = zahlen.slice();
// Spread
const zahlenKopie = [...zahlen];Alle hier vorgestellten Clone-Mechanismen erzeugen immer nur eine flache Kopie.
JavaScript Docs