Skip to content

Commit 6cde6d1

Browse files
authored
Merge pull request #1548 from Rnbsov/patch-33
update article
2 parents e3a3bde + 76628e0 commit 6cde6d1

File tree

24 files changed

+321
-284
lines changed

24 files changed

+321
-284
lines changed

1-js/04-object-basics/04-object-methods/4-object-property-this/solution.md

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,52 @@
44
```js run
55
function makeUser() {
66
return {
7-
name: "Джон",
7+
name: "John",
88
ref: this
99
};
10-
};
10+
}
1111

1212
let user = makeUser();
1313

1414
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
1515
```
1616

17-
Это потому, что правила, которые определяют значение `this`, никак не смотрят на объявление объекта. Важен лишь момент вызова метода.
17+
Это потому, что правила, которые определяют значение `this`, никак не смотрят на объявление объекта. Важен лишь момент вызова.
1818

19-
Здесь значение `this` внутри `makeUser()` является `undefined`, потому что `makeUser()` вызвана как функция, не через "точку" как метод.
19+
Здесь значение `this` внутри `makeUser()` равно `undefined`, потому что оно вызывается как функция, а не через "точечный" синтаксис как метод.
2020

21-
Литерал объекта сам по себе не влияет на `this`. Значение `this` одно для всей функции и блоков кода в ней, литеральные объекты не меняют его.
21+
Значение `this` одно для всей функции, блоки кода и объектные литералы на него не влияют.
2222

23-
Таким образом, при создании объекта `ref: this` берёт текущее значение `this` функции `makeUser()`.
23+
Таким образом, `ref: this` фактически принимает текущее `this` функции `makeUser()`.
2424

25-
А вот противоположный случай:
25+
Мы можем переписать функцию и вернуть то же самое `this` со значением `undefined`:
26+
27+
```js run
28+
function makeUser(){
29+
return this; // на этот раз нет литерала объекта
30+
}
31+
32+
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
33+
```
34+
Как вы можете видеть, результат `alert( makeUser().name )` совпадает с результатом `alert( user.ref.name )` из предыдущего примера.
35+
36+
Вот противоположный случай:
2637

2738
```js run
2839
function makeUser() {
2940
return {
30-
name: "Джон",
41+
name: "John",
3142
*!*
3243
ref() {
3344
return this;
3445
}
3546
*/!*
3647
};
37-
};
48+
}
3849

3950
let user = makeUser();
4051

41-
alert( user.ref().name ); // Джон
52+
alert( user.ref().name ); // John
4253
```
4354

44-
Теперь это работает, поскольку `user.ref()` вызывается как метод. И значением `this` становится объект перед точкой `.`.
55+
Теперь это работает, поскольку `user.ref()` - это метод. И значением `this` становится объект перед точкой `.`.

1-js/04-object-basics/04-object-methods/4-object-property-this/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ importance: 5
1111
```js
1212
function makeUser() {
1313
return {
14-
name: "Джон",
14+
name: "John",
1515
ref: this
1616
};
17-
};
17+
}
1818

1919
let user = makeUser();
2020

1-js/04-object-basics/04-object-methods/7-calculator/_js.view/test.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
describe("калькулятор", function() {
44

5-
context("Когда 2 и 3 введены", function() {
5+
context("когда 2 и 3 введены", function() {
66
beforeEach(function() {
77
sinon.stub(window, "prompt");
88

@@ -15,12 +15,17 @@ describe("калькулятор", function() {
1515
afterEach(function() {
1616
prompt.restore();
1717
});
18+
19+
it('read получает два значения и сохраняет их как свойства объекта', function () {
20+
assert.equal(calculator.a, 2);
21+
assert.equal(calculator.b, 3);
22+
});
1823

19-
it("Сумма равна 5", function() {
24+
it("сумма равна 5", function() {
2025
assert.equal(calculator.sum(), 5);
2126
});
2227

23-
it("Произведение равно 6", function() {
28+
it("произведение равно 6", function() {
2429
assert.equal(calculator.mul(), 6);
2530
});
2631
});

1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/solution.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ let ladder = {
1111
},
1212
showStep: function() {
1313
alert(this.step);
14+
return this;
1415
}
1516
};

1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/test.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,25 @@ describe('Лестница', function() {
2121
assert(alert.called);
2222
});
2323

24-
it('up() должен увеличивать ступеньки', function() {
24+
it('up() должен увеличивать ступеньку', function() {
2525
assert.equal(ladder.up().up().step, 2);
2626
});
2727

28-
it('down() должен уменьшать ступеньки', function() {
28+
it('down() должен уменьшать ступеньку', function() {
2929
assert.equal(ladder.down().step, -1);
3030
});
3131

3232
it('down().up().up().up() ', function() {
3333
assert.equal(ladder.down().up().up().up().step, 2);
3434
});
35+
36+
it('showStep() должен возвращать this', function() {
37+
assert.equal(ladder.showStep(), ladder);
38+
});
39+
40+
it('up().up().down().showStep().down().showStep()', function () {
41+
assert.equal(ladder.up().up().down().showStep().down().showStep().step, 0)
42+
});
3543

3644
after(function() {
3745
ladder.step = 0;

1-js/04-object-basics/04-object-methods/8-chain-calls/solution.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Решением является возврат самого объекта в каждом методе.
1+
Решение состоит в том, чтобы возвращать сам объект из каждого вызова.
22

33
```js run demo
44
let ladder = {
@@ -21,19 +21,19 @@ let ladder = {
2121
return this;
2222
*/!*
2323
}
24-
}
24+
};
2525

26-
ladder.up().up().down().up().down().showStep(); // 1
26+
ladder.up().up().down().showStep().down().showStep(); // показывает 1 затем 0
2727
```
2828

29-
Мы также можем писать один вызов на одной строке. Для длинной цепи вызовов это более читабельно:
29+
Мы также можем записать один вызов на одной строке. Для длинных цепей вызовов это более читабельно:
3030

3131
```js
3232
ladder
3333
.up()
3434
.up()
3535
.down()
36-
.up()
36+
.showStep() // 1
3737
.down()
38-
.showStep(); // 1
38+
.showStep(); // 0
3939
```

1-js/04-object-basics/04-object-methods/8-chain-calls/task.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 2
44

55
# Цепь вызовов
66

7-
Это `ladder` (лестница) - объект, который позволяет подниматься вверх и спускаться:
7+
У нас есть объект `ladder` (лестница), который позволяет подниматься и спускаться:
88

99
```js
1010
let ladder = {
@@ -21,19 +21,21 @@ let ladder = {
2121
};
2222
```
2323

24-
Теперь, если нам нужно сделать несколько последовательных вызовов, мы можем выполнить это так:
24+
Теперь, если нам нужно выполнить несколько последовательных вызовов, мы можем сделать это так:
2525

2626
```js
2727
ladder.up();
2828
ladder.up();
2929
ladder.down();
3030
ladder.showStep(); // 1
31+
ladder.down();
32+
ladder.showStep(); // 0
3133
```
3234

3335
Измените код методов `up`, `down` и `showStep` таким образом, чтобы их вызов можно было сделать по цепочке, например так:
3436

3537
```js
36-
ladder.up().up().down().showStep(); // 1
38+
ladder.up().up().down().showStep().down().showStep(); // показывает 1 затем 0
3739
```
3840

3941
Такой подход широко используется в библиотеках JavaScript.

0 commit comments

Comments
 (0)