aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/object/create
diff options
context:
space:
mode:
Diffstat (limited to 'files/ru/web/javascript/reference/global_objects/object/create')
-rw-r--r--files/ru/web/javascript/reference/global_objects/object/create/index.html240
1 files changed, 240 insertions, 0 deletions
diff --git a/files/ru/web/javascript/reference/global_objects/object/create/index.html b/files/ru/web/javascript/reference/global_objects/object/create/index.html
new file mode 100644
index 0000000000..d17862e00d
--- /dev/null
+++ b/files/ru/web/javascript/reference/global_objects/object/create/index.html
@@ -0,0 +1,240 @@
+---
+title: Object.create()
+slug: Web/JavaScript/Reference/Global_Objects/Object/create
+tags:
+ - ECMAScript5
+ - JavaScript
+ - Method
+ - Object
+ - Reference
+ - Référence(2)
+ - polyfill
+translation_of: Web/JavaScript/Reference/Global_Objects/Object/create
+---
+<div>{{JSRef}}</div>
+
+<p>Метод <code><strong>Object.create()</strong></code> создаёт новый объект с указанным прототипом и свойствами.</p>
+
+<h2 id="Syntax" name="Syntax">Синтаксис</h2>
+
+<pre class="syntaxbox notranslate"><code>Object.create(<var>proto</var>[, <var>propertiesObject</var>])</code></pre>
+
+<h3 id="Parameters" name="Parameters">Параметры</h3>
+
+<dl>
+ <dt><code>proto</code></dt>
+ <dd>Объект, который станет прототипом вновь созданного объекта.</dd>
+ <dt><code>propertiesObject</code></dt>
+ <dd>Необязательный параметр. Если указан и не равен {{jsxref("Global_Objects/undefined", "undefined")}}, должен быть объектом, чьи собственные перечисляемые свойства (то есть такие, которые определены на самом объекте, а не унаследованы по цепочке прототипов) указывают дескрипторы свойств, добавляемых в новый объект. Имена добавляемых свойств совпадают с именами свойств в этом объекте. Эти свойства соответствуют второму аргументу метода {{jsxref("Object.defineProperties()")}}.</dd>
+</dl>
+
+<h3 id="Возвращаемые_значения">Возвращаемые значения</h3>
+
+<p>Новый объект с заданным прототипом и свойствами</p>
+
+<h3 id="Throws" name="Throws">Выбрасываемые исключения</h3>
+
+<p>Выбрасывает исключение {{jsxref("Global_Objects/TypeError", "TypeError")}}, если параметр <code>proto</code> не является {{jsxref("Global_Objects/null", "null")}} или объектом (исключение составляют объекты-обертки примитивных типов).</p>
+
+<h2 id="Examples" name="Examples">Примеры</h2>
+
+<h3 id="Example.3A_Classical_inheritance_with_Object.create" name="Example.3A_Classical_inheritance_with_Object.create()">Пример: классическое наследование с <code>Object.create()</code></h3>
+
+<p>Ниже показан пример использования <code>Object.create()</code> для имитации классического наследования. Это пример одиночного наследования, поскольку только его поддерживает JavaScript.</p>
+
+<pre class="brush: js notranslate">// Shape — суперкласс
+function Shape() {
+ this.x = 0;
+ this.y = 0;
+}
+
+// метод суперкласса
+Shape.prototype.move = function(x, y) {
+ this.x += x;
+ this.y += y;
+ console.info('Фигура переместилась.');
+};
+
+// Rectangle — подкласс
+function Rectangle() {
+ Shape.call(this); // вызываем конструктор суперкласса
+}
+
+// подкласс расширяет суперкласс
+Rectangle.prototype = Object.create(Shape.prototype);
+Rectangle.prototype.constructor = Rectangle;
+
+var rect = new Rectangle();
+
+console.log('Является ли rect экземпляром Rectangle? ' + (rect instanceof Rectangle)); // true
+console.log('Является ли rect экземпляром Shape? ' + (rect instanceof Shape)); // true
+rect.move(1, 1); // выведет 'Фигура переместилась.'
+</pre>
+
+<p>Если вы хотите унаследоваться от нескольких объектов, то это возможно сделать при помощи примесей.</p>
+
+<pre class="brush: js notranslate">function MyClass() {
+ SuperClass.call(this);
+ OtherSuperClass.call(this);
+}
+
+MyClass.prototype = Object.create(SuperClass.prototype); // наследование
+mixin(MyClass.prototype, OtherSuperClass.prototype); // примешивание
+
+MyClass.prototype.myMethod = function() {
+ // что-то делаем
+};
+</pre>
+
+<p>Функция примешивания должна копировать функции из прототипа суперкласса в прототип подкласса, она должна предоставляться пользователем. Примером примеси может служить функция <a href="http://api.jquery.com/jQuery.extend/">jQuery.extend()</a>.</p>
+
+<h3 id="Example.3A_Using_propertiesObject_argument_with_Object.create" name="Example.3A_Using_propertiesObject_argument_with_Object.create()">Пример: использование аргумента <code>propertiesObject</code> с <code>Object.create()</code></h3>
+
+<pre class="brush: js notranslate">var o;
+
+// создаём объект с нулевым прототипом
+o = Object.create(null);
+
+
+o = {};
+// эквивалентно этому:
+o = Object.create(Object.prototype);
+
+
+// В этом примере мы создаём объект с несколькими свойствами.
+// (Обратите внимание, что второй параметр отображает ключи на *дескрипторы свойств*.)
+o = Object.create(Object.prototype, {
+ // foo является рядовым 'свойством-значением'
+ foo: { writable: true, configurable: true, value: 'привет' },
+ // bar является свойством с геттером и сеттером (свойством доступа)
+ bar: {
+ configurable: false,
+ get: function() { return 10; },
+ set: function(value) { console.log('Установка `o.bar` в', value); }
+/* при использовании методов доступа ES5 наш код мог бы выглядеть так:
+ get function() { return 10; },
+ set function(value) { console.log('Установка `o.bar` в', value); } */
+ }
+});
+
+
+function Constructor() {}
+o = new Constructor();
+// эквивалентно этому:
+o = Object.create(Constructor.prototype);
+// Конечно, если бы в функции Constructor был бы реальный код инициализации,
+// метод с Object.create() не был бы эквивалентным
+
+
+// создаём новый объект, чей прототип является новым пустым объектом
+// и добавляем простое свойство 'p' со значением 42
+o = Object.create({}, { p: { value: 42 } });
+
+// по умолчанию свойства НЕ ЯВЛЯЮТСЯ записываемыми, перечисляемыми или настраиваемыми:
+o.p = 24;
+o.p;
+// 42
+
+o.q = 12;
+for (var prop in o) {
+ console.log(prop);
+}
+// 'q'
+
+delete o.p;
+// false
+
+// для определения свойства ES3
+o2 = Object.create({}, {
+ p: {
+ value: 42,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ }
+});
+</pre>
+
+<h2 id="Polyfill" name="Polyfill">Полифилл</h2>
+
+<p>Для этого полифилла необходима правильно работающая Object.prototype.hasOwnProperty.</p>
+
+<pre class="brush: js notranslate">if (typeof Object.create != 'function') {
+ // Этапы производства ECMA-262, издание 5, 15.2.3.5
+ // Ссылка: http://es5.github.io/#x15.2.3.5
+ Object.create = (function() {
+  // Чтобы сэкономить память, используйте общий конструктор
+ function Temp() {}
+
+  // делает безопасную ссылку на Object.prototype.hasOwnProperty
+  var hasOwn = Object.prototype.hasOwnProperty;
+
+ return function (O) {
+  // 1. Если Type(O) не является Object or Null выдается исключениеTypeError.
+ if (typeof O != 'object') {
+ throw TypeError('Object prototype may only be an Object or null');
+ }
+
+  // 2. Пусть obj будет результатом создания нового объекта, как если бы
+  // выражение new Object(), где Object является стандартным встроенным
+  // конструктором с таким именем
+  // 3. Установите для внутреннего свойства [[Prototype]] объекта obj значение O.
+ Temp.prototype = O;
+ var obj = new Temp();
+ Temp.prototype = null; // Давайте не будем держать случайные ссылки на О...
+
+  // 4.  Если аргумент Properties присутствует и не определен, добавляем
+  // собственные свойства к obj, как будто вызывая стандартную встроенную
+  // функцию Object.defineProperties с аргументами obj и
+  // Properties.
+  if (arguments.length &gt; 1) {
+  // Object.defineProperties делает ToObject своим первым аргументом.
+  var Properties = Object(arguments[1]);
+  for (var prop in Properties) {
+  if (hasOwn.call(Properties, prop)) {
+  obj[prop] = Properties[prop];
+  }
+  }
+  }
+
+  // 5. Возращает obj
+ return obj;
+ };
+ })();
+}
+</pre>
+
+<h2 id="Specifications" name="Specifications">Спецификации</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Спецификация</th>
+ <th scope="col">Статус</th>
+ <th scope="col">Комментарии</th>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES5.1', '#sec-15.2.3.5', 'Object.create')}}</td>
+ <td>{{Spec2('ES5.1')}}</td>
+ <td>Изначальное определение. Реализована в JavaScript 1.8.5.</td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES6', '#sec-object.create', 'Object.create')}}</td>
+ <td>{{Spec2('ES6')}}</td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Browser_compatibility" name="Browser_compatibility">Совместимость с браузерами</h2>
+
+<div>{{Compat("javascript.builtins.Object.create")}}</div>
+
+<h2 id="See_also" name="See_also">Смотрите также</h2>
+
+<ul>
+ <li>{{jsxref("Object.defineProperty()")}}</li>
+ <li>{{jsxref("Object.defineProperties()")}}</li>
+ <li>{{jsxref("Object.prototype.isPrototypeOf()")}}</li>
+ <li>Запись в блоге Джона Резига о <a href="http://ejohn.org/blog/objectgetprototypeof/">getPrototypeOf()</a></li>
+</ul>