F.prototype by ockley · Pull Request #261 · javascript-tutorial/da.javascript.info · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ importance: 5

---

# Changing "prototype"
# Ændring af "prototype"

In the code below we create `new Rabbit`, and then try to modify its prototype.
I koden nedenfor opretter vi `new Rabbit`, og forsøger derefter at ændre dens prototype.

In the start, we have this code:
I starten har vi følgende kode:

```js run
function Rabbit() {}
Expand All @@ -20,7 +20,7 @@ alert( rabbit.eats ); // true
```


1. We added one more string (emphasized). What will `alert` show now?
1. Vi har tilføjet endnu en streng (fremhævet). Hvad viser `alert` nu?

```js
function Rabbit() {}
Expand All @@ -37,7 +37,7 @@ alert( rabbit.eats ); // true
alert( rabbit.eats ); // ?
```

2. ...And if the code is like this (replaced one line)?
2. ...Og hvis koden ser således ud (har erstattet en linje)?

```js
function Rabbit() {}
Expand All @@ -54,7 +54,7 @@ alert( rabbit.eats ); // true
alert( rabbit.eats ); // ?
```

3. And like this (replaced one line)?
3. Og, hvad med denne her (har erstattet en linje)?

```js
function Rabbit() {}
Expand All @@ -71,7 +71,7 @@ alert( rabbit.eats ); // true
alert( rabbit.eats ); // ?
```

4. The last variant:
4. Sidste variant?

```js
function Rabbit() {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
We can use such approach if we are sure that `"constructor"` property has the correct value.
Vi kan bruge denne tilgang hvis vi er sikre på at `"constructor"` egenskaben har den korrekte værdi.

For instance, if we don't touch the default `"prototype"`, then this code works for sure:
For eksempel, hvis vi ikke rører ved standard `"prototype"`, så virker denne kode altid:

```js run
function User(name) {
this.name = name;
}

let user = new User('John');
let user2 = new user.constructor('Pete');
let user = new User('Jan');
let user2 = new user.constructor('Helene');

alert( user2.name ); // Pete (worked!)
alert( user2.name ); // Helene (virker!)
```

It worked, because `User.prototype.constructor == User`.
Det virker fordi `User.prototype.constructor == User`.

..But if someone, so to speak, overwrites `User.prototype` and forgets to recreate `constructor` to reference `User`, then it would fail.
..Men hvis en overskriver `User.prototype` uden at genskabe `constructor` som reference til `User`, så vil det fejle.

For instance:
For eksempel:

```js run
function User(name) {
Expand All @@ -27,23 +27,23 @@ function User(name) {
User.prototype = {}; // (*)
*/!*

let user = new User('John');
let user2 = new user.constructor('Pete');
let user = new User('Jan');
let user2 = new user.constructor('Helene');

alert( user2.name ); // undefined
```

Why `user2.name` is `undefined`?
Hvorfor er `user2.name` `undefined`?

Here's how `new user.constructor('Pete')` works:
Sådan her virker `new user.constructor('Helene')`:

1. First, it looks for `constructor` in `user`. Nothing.
2. Then it follows the prototype chain. The prototype of `user` is `User.prototype`, and it also has no `constructor` (because we "forgot" to set it right!).
3. Going further up the chain, `User.prototype` is a plain object, its prototype is the built-in `Object.prototype`.
4. Finally, for the built-in `Object.prototype`, there's a built-in `Object.prototype.constructor == Object`. So it is used.
1. Først kigger den efter `constructor` i `user`. Intet fundet.
2. Derefter følger den prototypen. Prototypen af `user` er `User.prototype`, og den har også ingen `constructor` (fordi vi "glemte" at genskabe den!).
3. Går videre op i kæden, `User.prototype` er et almindeligt objekt, og dens prototype er den indbyggede `Object.prototype`.
4. Til sidst, for den indbyggede `Object.prototype`, findes der en indbygget `Object.prototype.constructor == Object`. Så bruges denne.

Finally, at the end, we have `let user2 = new Object('Pete')`.
Til sidst har vi altså noget der oversat ser ud som `let user2 = new Object('Helene')`.

Probably, that's not what we want. We'd like to create `new User`, not `new Object`. That's the outcome of the missing `constructor`.
Helt sikkert ikke det vi vil. Vi ønsker at skabe `new User`, ikke `new Object`. Det er resultatet af den manglende `constructor`.

(Just in case you're curious, the `new Object(...)` call converts its argument to an object. That's a theoretical thing, in practice no one calls `new Object` with a value, and generally we don't use `new Object` to make objects at all).
(Bare, i det tilfælde, at du er nysgerrig: Kaldet til `new Object(...)` konverterer dets argument til et objekt. Det er en teoretisk ting, i praksis kalder ingen `new Object` med en værdi, og generelt bruger vi ikke `new Object` til at lave objekter).
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ importance: 5

---

# Create an object with the same constructor
# Opret et objekt med samme konstruktør

Imagine, we have an arbitrary object `obj`, created by a constructor function -- we don't know which one, but we'd like to create a new object using it.
Forestil dig, vi har et vilkårligt objekt `obj`, skabt af en konstruktør funktion -- vi ved ikke hvilken, men vi vil gerne skabe et nyt objekt med samme konstruktør.

Can we do it like that?
Kan vi gøre det sådan?

```js
let obj2 = new obj.constructor();
```

Give an example of a constructor function for `obj` which lets such code work right. And an example that makes it work wrong.
Giv et eksempel på en konstruktør funktion for `obj` som lader sådan kode virke korrekt. Og et eksempel som gør det forkert.
99 changes: 50 additions & 49 deletions 1-js/08-prototypes/02-function-prototype/article.md
Loading