Skip to content

Commit 8bc1633

Browse files
committed
function/constructors
1 parent c4e4531 commit 8bc1633

File tree

2 files changed

+33
-63
lines changed

2 files changed

+33
-63
lines changed

doc/ru/function/arguments.md

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
## Объект `arguments`
22

3-
В области видимости любой функции в JavaScript есть доступ к специальной переменной `arguments`. Эта переменная содержит в себе список всех аргументов? переданных данной функции ghb dspjdt.
4-
5-
Every function scope in JavaScript can access the special variable `arguments`.
6-
This variable holds a list of all the arguments that were passed to the function.
3+
В области видимости любой функции в JavaScript есть доступ к специальной переменной `arguments`. Эта переменная содержит в себе список всех аргументов, переданных данной функции.
74

85
> **Замечание:** В случае, если переменная `arguments` уже была объявлена в области видимости функции либо путём присвоения через выражение `var`, либо являясь формальным параметром, объект `arguments` не будет создан.
96
@@ -17,7 +14,7 @@ This variable holds a list of all the arguments that were passed to the function
1714

1815
Array.prototype.slice.call(arguments);
1916

20-
Эта конвертация занимает **много времени** и **не рекомендуется** использовать её в критических частях кода.
17+
Эта конвертация занимает **много времени** и использовать её в критических частях кода **не рекомендуется**.
2118

2219
### Передача аргументов
2320

@@ -27,7 +24,7 @@ This variable holds a list of all the arguments that were passed to the function
2724
bar.apply(null, arguments);
2825
}
2926
function bar(a, b, c) {
30-
// делаем здесь что-либо
27+
// делаем здесь что-нибудь
3128
}
3229

3330
Другой трюк — использовать и `call` и `apply` вместе, чтобы быстро создать несвязанную обёртку:
@@ -69,9 +66,9 @@ This variable holds a list of all the arguments that were passed to the function
6966

7067
### Мифы и правда о производительности
7168

72-
Объект `arguments` создаётся во всех случаях, лишь за двумя исключениямии — когда он переопределён по имени внутри функции или когда одним из её параметров является переменная с таким именем. Не важно, используется он при этом или нет.
69+
Объект `arguments` создаётся во всех случаях, лишь за двумя исключениями — когда он переопределён внутри функции (по имени) или когда одним из её параметров является переменная с таким именем. Не важно, используется при этом сам объект или нет.
7370

74-
*Геттеры* и *сеттеры* создаются **всегда**; так что, их использование почти никак не влияет на производительность.
71+
*Геттеры* и *сеттеры* создаются **всегда**; так что, их использование практически никак не влияет на производительность.
7572

7673
> **ES5 Замечание:** Эти *геттеры* и *сеттеры* не создаются в strict-режиме.
7774
@@ -88,11 +85,11 @@ This variable holds a list of all the arguments that were passed to the function
8885
}
8986
}
9087

91-
В коде выше, `foo` больше не может [быть развёрнута][1], потому что ей необходима ссылка и на себя, и на вызвавший объект. Это не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова.
88+
В коде выше, `foo` больше не может [быть развёрнута][1], потому что для работы ей необходима ссылка и на себя и на вызвавший её объект. Это не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова.
9289

93-
**Крайне рекомендуется** **никогда** не использовать `arguments.callee` или его свойства.
90+
**Крайне не рекомендуется** использовать `arguments.callee` или какое-либо из его свойств. **Никогда**.
9491

95-
> **ES5 Замечание:** В strict-режиме `arguments.callee` выбросит `TypeError`, поскольку его использование принято устаревшим.
92+
> **ES5 Замечание:** В strict-режиме использование `arguments.callee` породит `TypeError`, поскольку его использование принято устаревшим.
9693
9794
[1]: http://en.wikipedia.org/wiki/Inlining
9895

doc/ru/function/constructors.md

Lines changed: 25 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
## Constructors
1+
## Конструктор
22

3-
Constructors in JavaScript are yet again different from many other languages. Any
4-
function call that is preceded by the `new` keyword acts as a constructor.
3+
Создание конструкторов в JavaScript также отличается от большинства других языков. Любая функция вызванная с использованием ключевого слова `new` будет конструктором.
54

6-
Inside the constructor - the called function - the value of `this` refers to a
7-
newly created `Object`. The [`prototype`](#object.prototype) of this **new**
8-
object is set to the `prototype` of the function object that was invoked as the
9-
constructor.
5+
Внутри конструктора (вызываемой функции) `this` будет указывать на новосозданный `Object`. [Прототипом](#object.prototype) этого **нового** объекта будет `prototype` функции, которая была вызвана в качестве коструктора.
106

11-
If the function that was called has no explicit `return` statement, then it
12-
implicitly returns the value of `this` - the new object.
7+
Если вызываемая функция не имеет явного возврата посредством `return`, то вернётся `this` — этот новый объект.
138

149
function Foo() {
1510
this.bla = 1;
@@ -21,16 +16,14 @@ implicitly returns the value of `this` - the new object.
2116

2217
var test = new Foo();
2318

24-
The above calls `Foo` as constructor and sets the `prototype` of the newly
25-
created object to `Foo.prototype`.
19+
В этом примере `Foo` вызывается как конструктор и прототип созданного объекта будет привязан к `Foo.prototype`.
2620

27-
In case of an explicit `return` statement the function returns the value
28-
specified that statement, **but only** if the return value is an `Object`.
21+
В случае, когда функция в явном виде возвращает некое значение используя `return`, то мы получим именно его, **но только** если возвращаемое значение представляет собой `Object`.
2922

3023
function Bar() {
3124
return 2;
3225
}
33-
new Bar(); // a new object
26+
new Bar(); // новый объект
3427

3528
function Test() {
3629
this.value = 2;
@@ -39,23 +32,20 @@ specified that statement, **but only** if the return value is an `Object`.
3932
foo: 1
4033
};
4134
}
42-
new Test(); // the returned object
35+
new Test(); // возвращённый объект
4336

44-
When the `new` keyword is omitted, the function will **not** return a new object.
37+
Если же опустить ключевое слово `new`, то функция **не** будет возвращать каких-либо объектов.
4538

4639
function Foo() {
47-
this.bla = 1; // gets set on the global object
40+
this.bla = 1; // устанавливается глобальному объекту
4841
}
4942
Foo(); // undefined
5043

51-
While the above example might still appear to work in some cases, due to the
52-
workings of [`this`](#function.this) in JavaScript, it will use the
53-
*global object* as the value of `this`.
44+
Приведенный пример в некоторых случаях может всё-таки сработать, это связано с поведением [`this`](#function.this) в JavaScript — он будет восприниматься парсером как *глобальный объект*.
5445

55-
### Factories
46+
### Фабрики
5647

57-
In order to be able to omit the `new` keyword, the constructor function has to
58-
explicitly return a value.
48+
Если хотите избавится от `new`, напишите конструктор, возвращающий значение используя `return`.
5949

6050
function Bar() {
6151
var value = 1;
@@ -72,25 +62,17 @@ explicitly return a value.
7262
new Bar();
7363
Bar();
7464

75-
Both calls to `Bar` return the exact same thing, a newly create object which
76-
has a property called `method` on it, that is a
77-
[Closure](#function.closures).
65+
В обоих случаях при вызове `Bar` мы получим один и тот же результат — новый объект со свойством `method` (спасибо [замыканию](#function.closures) за это).
7866

79-
It is also to note that the call `new Bar()` does **not** affect the prototype
80-
of the returned object. While the prototype will be set on the newly created
81-
object, `Bar` never returns that new object.
67+
Так же следует заметить, что вызов `new Bar()` никак **не** связан с прототипом возвращаемого объекта. Хоть прототип и назначается всем новосозданным объектам, но `Bar` никогда не возвращает этот новый объект.
8268

83-
In the above example, there is no functional difference between using and
84-
not using the `new` keyword.
69+
В предыдущем примере нет функциональных отличий между вызовом конструктора с или без `new`.
8570

71+
### Создание объектов используя фабрики
8672

87-
### Creating new objects via factories
73+
Часто рекомендуется **не** использовать `new`, поскольку если вы его забудете, это может привести к багам.
8874

89-
An often made recommendation is to **not** use `new` since forgetting its use
90-
may lead to bugs.
91-
92-
In order to create new object, one should rather use a factory and construct a
93-
new object inside of that factory.
75+
Чтобы создать новый объект, лучше использовать фабрику и создать новый объект *внутри* этой фабрики.
9476

9577
function Foo() {
9678
var obj = {};
@@ -107,22 +89,13 @@ new object inside of that factory.
10789
return obj;
10890
}
10991

110-
While the above is robust against a missing `new` keyword and certainly makes
111-
the use of [private variables](#function.closures) easier, it comes with some
112-
downsides.
92+
Хотя данный пример и сработает, если вы забыли ключевое слово `new` и благодаря ему легче работать с [приватными переменными](#function.closures), у него есть несколько недостатков
11393

114-
1. It uses more memory since the created objects do **not** share the methods
115-
on a prototype.
116-
2. In order to inherit the factory needs to copy all the methods from another
117-
object or put that object on the prototype of the new object.
118-
3. Dropping the prototype chain just because of a left out `new` keyword
119-
somehow goes against the spirit of the language.
94+
1. Он использует больше памяти, поскольку созданные объекты **не** хранят методы в прототипе и соответственно для каждого нового объекта создаётся копия каждого метода.
95+
2. Чтобы эмулировать наследование, фабрике нужно скопировать все методы из другого объекта или установить прототипом нового объекта старый.
96+
3. Разрыв цепи прототипов просто по причине забытого ключевого слова `new` идёт в разрез с духом языка.
12097

121-
### In conclusion
98+
### Заключение
12299

123-
While omitting the `new` keyword might lead to bugs, it is certainly **not** a
124-
reason to drop the use of prototypes altogether. In the end it comes down to
125-
which solution is better suited for the needs of the application, it is
126-
especially important to choose a specific style of object creation **and stick**
127-
with it.
100+
Хотя забытое ключевое слово `new` и может привести к багам, это точно **не** причина отказываться от использования прототипов. В конце концов, полезнее решить какой из способов лучше совпадает с требованиями приложения, очень важно выбрать один из стилей создания объектов и **не изменять** ему.
128101

0 commit comments

Comments
 (0)