You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
7
7
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.
9
9
10
-
## Getters and setters
10
+
## Getters og setters
11
11
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`:
13
13
14
14
```js
15
15
let obj = {
16
16
*!*get propName()*/!* {
17
-
// getter, the code executed on getting obj.propName
17
+
// getter, koden afvikles når værdien i obj.propName læses
18
18
},
19
19
20
20
*!*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
22
22
}
23
23
};
24
24
```
25
25
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.
27
27
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`:
29
29
30
30
```js
31
31
let user = {
32
-
name:"John",
33
-
surname:"Smith"
32
+
name:"Karsten",
33
+
surname:"Vestergaard"
34
34
};
35
35
```
36
36
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:
38
38
39
39
```js run
40
40
let user = {
41
-
name:"John",
42
-
surname:"Smith",
41
+
name:"Karsten",
42
+
surname:"Vestergaard",
43
43
44
44
*!*
45
45
getfullName() {
@@ -49,13 +49,13 @@ let user = {
49
49
};
50
50
51
51
*!*
52
-
alert(user.fullName); //John Smith
52
+
alert(user.fullName); //Karsten Vestergaard
53
53
*/!*
54
54
```
55
55
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.
57
57
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:
59
59
60
60
```js run
61
61
let user = {
@@ -65,16 +65,16 @@ let user = {
65
65
};
66
66
67
67
*!*
68
-
user.fullName="Test"; //Error (property has only a getter)
68
+
user.fullName="Test"; //Fejl (egenskaben har kun en getter)
69
69
*/!*
70
70
```
71
71
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`:
73
73
74
74
```js run
75
75
let user = {
76
-
name:"John",
77
-
surname:"Smith",
76
+
name:"Karsten",
77
+
surname:"Vestergaard",
78
78
79
79
getfullName() {
80
80
return`${this.name}${this.surname}`;
@@ -87,34 +87,34 @@ let user = {
87
87
*/!*
88
88
};
89
89
90
-
// set fullName is executed with the given value.
90
+
// set fullName bliver afviklet når en værdi tildeles.
91
91
user.fullName="Alice Cooper";
92
92
93
93
alert(user.name); // Alice
94
94
alert(user.surname); // Cooper
95
95
```
96
96
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.
98
98
99
99
## Accessor descriptors
100
100
101
-
Descriptors for accessor properties are different from those for data properties.
101
+
Descriptors for accessor egenskaber er anderledes end dem for data egenskaber.
102
102
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.
104
104
105
-
That is, an accessor descriptor may have:
105
+
Samlet set har en accessor descriptor følgende:
106
106
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.
111
111
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`:
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.
138
138
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.:
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.
157
157
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`:
159
159
160
160
```js run
161
161
let user = {
@@ -165,29 +165,29 @@ let user = {
165
165
166
166
setname(value) {
167
167
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");
169
169
return;
170
170
}
171
171
this._name= value;
172
172
}
173
173
};
174
174
175
-
user.name="Pete";
176
-
alert(user.name); //Pete
175
+
user.name="Henrik";
176
+
alert(user.name); //Henrik
177
177
178
-
user.name=""; //Name is too short...
178
+
user.name=""; //Navnet er for kort...
179
179
```
180
180
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.
182
182
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.
184
184
185
185
186
186
## Using for compatibility
187
187
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.
189
189
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`:
191
191
192
192
```js
193
193
functionUser(name, age) {
@@ -200,7 +200,7 @@ let john = new User("John", 25);
200
200
alert( john.age ); // 25
201
201
```
202
202
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:
204
204
205
205
```js
206
206
functionUser(name, birthday) {
@@ -211,21 +211,21 @@ function User(name, birthday) {
211
211
let john =newUser("John", newDate(1992, 6, 1));
212
212
```
213
213
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?
215
215
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?
217
217
218
-
Let's keep it.
218
+
Lad os beholde den.
219
219
220
-
Adding a getter for `age`solves the problem:
220
+
Tilføj en getter for `age`som løsning på problemet:
221
221
222
222
```js run no-beautify
223
223
functionUser(name, birthday) {
224
224
this.name= name;
225
225
this.birthday= birthday;
226
226
227
227
*!*
228
-
// age is calculated from the current date and birthday
228
+
// age beregnes fra den nuværende dato og fødselsdagen
229
229
Object.defineProperty(this, "age", {
230
230
get() {
231
231
let todayYear =newDate().getFullYear();
@@ -237,8 +237,8 @@ function User(name, birthday) {
237
237
238
238
let john =newUser("John", newDate(1992, 6, 1));
239
239
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
242
242
```
243
243
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