Skip to content

Commit 69d0118

Browse files
authored
Merge pull request #259 from ockley/master
Property getters and setters
2 parents 1f069e9 + eea182e commit 69d0118

File tree

1 file changed

+58
-58
lines changed
  • 1-js/07-object-properties/02-property-accessors

1 file changed

+58
-58
lines changed
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,45 @@
11

2-
# Property getters and setters
2+
# Getters og setters for egenskaber
33

4-
There are two kinds of object properties.
4+
Der er to typer af objektegenskaber.
55

6-
The first kind is *data properties*. We already know how to work with them. All properties that we've been using until now were data properties.
6+
Den første type er *data egenskaber*. Vi ved allerede hvordan man arbejder med dem. Alle egenskaber, som vi har brugt indtil nu, var data egenskaber.
77

8-
The second type of property is something new. It's an *accessor property*. They are essentially functions that execute on getting and setting a value, but look like regular properties to an external code.
8+
Den anden type er *accessor egenskaber*. De er faktisk funktioner, der kører ved læsning og skrivning af en værdi, men ser ud som normale egenskaber for ekstern kode.
99

10-
## Getters and setters
10+
## Getters og setters
1111

12-
Accessor properties are represented by "getter" and "setter" methods. In an object literal they are denoted by `get` and `set`:
12+
Accessor egenskaber er repræsenteret ved "getter" og "setter" metoder. I en objekt-literal bliver de betegnet med `get` og `set`:
1313

1414
```js
1515
let obj = {
1616
*!*get propName()*/!* {
17-
// getter, the code executed on getting obj.propName
17+
// getter, koden afvikles når værdien i obj.propName læses
1818
},
1919

2020
*!*set propName(value)*/!* {
21-
// setter, the code executed on setting obj.propName = value
21+
// setter, koden afvikles når værdien i obj.propName sættes
2222
}
2323
};
2424
```
2525

26-
The getter works when `obj.propName` is read, the setter -- when it is assigned.
26+
Getter virker når `obj.propName` læses, setter virker når `obj.propName = value` sættes.
2727

28-
For instance, we have a `user` object with `name` and `surname`:
28+
Hvis vi for eksempel har et `user` objekt med `name` og `surname`:
2929

3030
```js
3131
let user = {
32-
name: "John",
33-
surname: "Smith"
32+
name: "Karsten",
33+
surname: "Vestergaard"
3434
};
3535
```
3636

37-
Now we want to add a `fullName` property, that should be `"John Smith"`. Of course, we don't want to copy-paste existing information, so we can implement it as an accessor:
37+
Nu vil vi gerne have en egenskab kaldet `fullName`, som skal være `"Karsten Vestergaard"`. Selvfølgelig vil vi ikke kopiere eksisterende information, så vi kan implementere det som en accessor:
3838

3939
```js run
4040
let user = {
41-
name: "John",
42-
surname: "Smith",
41+
name: "Karsten",
42+
surname: "Vestergaard",
4343

4444
*!*
4545
get fullName() {
@@ -49,13 +49,13 @@ let user = {
4949
};
5050

5151
*!*
52-
alert(user.fullName); // John Smith
52+
alert(user.fullName); // Karsten Vestergaard
5353
*/!*
5454
```
5555

56-
From the outside, an accessor property looks like a regular one. That's the idea of accessor properties. We don't *call* `user.fullName` as a function, we *read* it normally: the getter runs behind the scenes.
56+
Udefra ligner en accessor egenskab en helt normal egenskab - det er hele ideen med accessor egenskaber. Vi *kalder ikke* `user.fullName` som en funktion, vi *læser den* som en normal værdi: Getter'en virker bag scenetæppet.
5757

58-
As of now, `fullName` has only a getter. If we attempt to assign `user.fullName=`, there will be an error:
58+
For nu har `fullName` kun en getter. Hvis vi prøver at tildele `user.fullName = value`, vil der være en fejl, fordi der ikke er nogen setter:
5959

6060
```js run
6161
let user = {
@@ -65,16 +65,16 @@ let user = {
6565
};
6666

6767
*!*
68-
user.fullName = "Test"; // Error (property has only a getter)
68+
user.fullName = "Test"; // Fejl (egenskaben har kun en getter)
6969
*/!*
7070
```
7171

72-
Let's fix it by adding a setter for `user.fullName`:
72+
Lad og fikse det ved at tilføje en setter for `user.fullName`:
7373

7474
```js run
7575
let user = {
76-
name: "John",
77-
surname: "Smith",
76+
name: "Karsten",
77+
surname: "Vestergaard",
7878

7979
get fullName() {
8080
return `${this.name} ${this.surname}`;
@@ -87,34 +87,34 @@ let user = {
8787
*/!*
8888
};
8989

90-
// set fullName is executed with the given value.
90+
// set fullName bliver afviklet når en værdi tildeles.
9191
user.fullName = "Alice Cooper";
9292

9393
alert(user.name); // Alice
9494
alert(user.surname); // Cooper
9595
```
9696

97-
As the result, we have a "virtual" property `fullName`. It is readable and writable.
97+
Som resultat har vi en "virtuel" egenskab `fullName`. Den er læsbar og skrivbar udadtil, men skjuler den indre struktur af `user` objektet, som består af `name` og `surname`. Det er en af de vigtigste fordele ved accessor egenskaber: De giver os mulighed for at abstrahere og skjule den indre struktur af data.
9898

9999
## Accessor descriptors
100100

101-
Descriptors for accessor properties are different from those for data properties.
101+
Descriptors for accessor egenskaber er anderledes end dem for data egenskaber.
102102

103-
For accessor properties, there is no `value` or `writable`, but instead there are `get` and `set` functions.
103+
For accessor egenskaber er der ingen `value` eller `writable`. I stedet er der `get` og `set` funktioner.
104104

105-
That is, an accessor descriptor may have:
105+
Samlet set har en accessor descriptor følgende:
106106

107-
- **`get`** -- a function without arguments, that works when a property is read,
108-
- **`set`** -- a function with one argument, that is called when the property is set,
109-
- **`enumerable`** -- same as for data properties,
110-
- **`configurable`** -- same as for data properties.
107+
- **`get`** -- en funktion uden argumenter, der kører når en egenskab læses,
108+
- **`set`** -- en funktion med ét argument, der kører når en egenskab sættes,
109+
- **`enumerable`** -- samme som for data egenskaber,
110+
- **`configurable`** -- samme som for data egenskaber.
111111

112-
For instance, to create an accessor `fullName` with `defineProperty`, we can pass a descriptor with `get` and `set`:
112+
Hvis vi vil skabe en accessor `fullName` med `defineProperty` skal vi videregive en descriptor med `get` og `set`:
113113

114114
```js run
115115
let user = {
116-
name: "John",
117-
surname: "Smith"
116+
name: "Karsten",
117+
surname: "Vestergaard"
118118
};
119119

120120
*!*
@@ -129,18 +129,18 @@ Object.defineProperty(user, 'fullName', {
129129
*/!*
130130
});
131131

132-
alert(user.fullName); // John Smith
132+
alert(user.fullName); // Karsten Vestergaard
133133

134134
for(let key in user) alert(key); // name, surname
135135
```
136136

137-
Please note that a property can be either an accessor (has `get/set` methods) or a data property (has a `value`), not both.
137+
Bemærk at en egenskab kan enten være en accessor (har `get/set` metoder) eller en data egenskab (har en `value`), ikke begge dele.
138138

139-
If we try to supply both `get` and `value` in the same descriptor, there will be an error:
139+
Hvis vi forsøger at give både `get` og `value` i samme descriptor, vil der være en fejl, fordi det er umuligt at have en egenskab, der både er en accessor og en data egenskab.:
140140

141141
```js run
142142
*!*
143-
// Error: Invalid property descriptor.
143+
// Fejl: Ugyldig descriptor.
144144
*/!*
145145
Object.defineProperty({}, 'prop', {
146146
get() {
@@ -151,11 +151,11 @@ Object.defineProperty({}, 'prop', {
151151
});
152152
```
153153

154-
## Smarter getters/setters
154+
## Smartere getters/setters
155155

156-
Getters/setters can be used as wrappers over "real" property values to gain more control over operations with them.
156+
Getters/setters kan bruges som wrappers over "reelle" egenskabsværdier for at få mere kontrol over operationer med dem.
157157

158-
For instance, if we want to forbid too short names for `user`, we can have a setter `name` and keep the value in a separate property `_name`:
158+
For eksempel, hvis vi vil forbyde for korte navne for `user`, kan vi have en setter `name` og gemme værdien i en separat egenskab `_name`:
159159

160160
```js run
161161
let user = {
@@ -165,29 +165,29 @@ let user = {
165165

166166
set name(value) {
167167
if (value.length < 4) {
168-
alert("Name is too short, need at least 4 characters");
168+
alert("Navnet er for kort. Det skal have mindst 4 tegn");
169169
return;
170170
}
171171
this._name = value;
172172
}
173173
};
174174

175-
user.name = "Pete";
176-
alert(user.name); // Pete
175+
user.name = "Henrik";
176+
alert(user.name); // Henrik
177177

178-
user.name = ""; // Name is too short...
178+
user.name = ""; // Navnet er for kort...
179179
```
180180

181-
So, the name is stored in `_name` property, and the access is done via getter and setter.
181+
Så navnet er gemt i egenskaben `_name`, og adgangen sker via getter og setter.
182182

183-
Technically, external code is able to access the name directly by using `user._name`. But there is a widely known convention that properties starting with an underscore `"_"` are internal and should not be touched from outside the object.
183+
Teknisk set er udvendig kode i stand til at tilgå navnet direkte ved brug af `user._name`. Men der er en bredt anerkendt konvention om, at egenskaber, der starter med et understreg `"_"` er interne og ikke bør røres fra uden for objektet.
184184

185185

186186
## Using for compatibility
187187

188-
One of the great uses of accessors is that they allow to take control over a "regular" data property at any moment by replacing it with a getter and a setter and tweak its behavior.
188+
En af de store fordele ved accessors er, at de giver os mulighed for at tage kontrol over en "almindelig" data egenskab på et hvilket som helst tidspunkt ved at erstatte den med en getter og en setter og tilpasse dens adfærd.
189189

190-
Imagine we started implementing user objects using data properties `name` and `age`:
190+
Forestil dig, at vi startede med at implementere brugerobjekter ved brug af data egenskaber `name` og `age`:
191191

192192
```js
193193
function User(name, age) {
@@ -200,7 +200,7 @@ let john = new User("John", 25);
200200
alert( john.age ); // 25
201201
```
202202

203-
...But sooner or later, things may change. Instead of `age` we may decide to store `birthday`, because it's more precise and convenient:
203+
...men på et tidspunkt kan tingene ændre sig. I stedet for `age` kan vi beslutte os for at gemme `birthday`, fordi det er mere præcist og praktisk at have. Så vi ændrer `User` konstruktøren:
204204

205205
```js
206206
function User(name, birthday) {
@@ -211,21 +211,21 @@ function User(name, birthday) {
211211
let john = new User("John", new Date(1992, 6, 1));
212212
```
213213

214-
Now what to do with the old code that still uses `age` property?
214+
Hvad gør vi nu med den gamle kode der stadig bruger `age` egenskaben?
215215

216-
We can try to find all such places and fix them, but that takes time and can be hard to do if that code is used by many other people. And besides, `age` is a nice thing to have in `user`, right?
216+
Vi kan forsøge at finde alle disse steder og fikse dem, men det tager tid og kan være svært at gøre, hvis koden bruges af mange andre personer. Og desuden er `age` en dejlig ting at have i `user`, ikke sandt?
217217

218-
Let's keep it.
218+
Lad os beholde den.
219219

220-
Adding a getter for `age` solves the problem:
220+
Tilføj en getter for `age` som løsning på problemet:
221221

222222
```js run no-beautify
223223
function User(name, birthday) {
224224
this.name = name;
225225
this.birthday = birthday;
226226

227227
*!*
228-
// age is calculated from the current date and birthday
228+
// age beregnes fra den nuværende dato og fødselsdagen
229229
Object.defineProperty(this, "age", {
230230
get() {
231231
let todayYear = new Date().getFullYear();
@@ -237,8 +237,8 @@ function User(name, birthday) {
237237

238238
let john = new User("John", new Date(1992, 6, 1));
239239

240-
alert( john.birthday ); // birthday is available
241-
alert( john.age ); // ...as well as the age
240+
alert( john.birthday ); // birthday er tilgængelig
241+
alert( john.age ); // ...det samme er age
242242
```
243243

244-
Now the old code works too and we've got a nice additional property.
244+
Nu vil den gamle kode stadig virke og vi har fået en ny, brugbar egenskab.

0 commit comments

Comments
 (0)