diff options
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.html | 240 |
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 > 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> |
