diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
commit | 074785cea106179cb3305637055ab0a009ca74f2 (patch) | |
tree | e6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/reference/operators/instanceof/index.html | |
parent | da78a9e329e272dedb2400b79a3bdeebff387d47 (diff) | |
download | translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2 translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip |
initial commit
Diffstat (limited to 'files/ru/web/javascript/reference/operators/instanceof/index.html')
-rw-r--r-- | files/ru/web/javascript/reference/operators/instanceof/index.html | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/files/ru/web/javascript/reference/operators/instanceof/index.html b/files/ru/web/javascript/reference/operators/instanceof/index.html new file mode 100644 index 0000000000..81676c6bf5 --- /dev/null +++ b/files/ru/web/javascript/reference/operators/instanceof/index.html @@ -0,0 +1,165 @@ +--- +title: instanceof +slug: Web/JavaScript/Reference/Operators/instanceof +tags: + - JavaScript + - Relational Operators + - instanceof + - Объект + - Оператор + - прототип +translation_of: Web/JavaScript/Reference/Operators/instanceof +--- +<div>{{jsSidebar("Operators")}}</div> + +<p>Оператор <strong><code>instanceof</code> </strong>проверяет, принадлежит ли объект к определённому классу. Другими словами, <code>object instanceof constructor</code><em> </em>проверяет, присутствует ли объект <code>constructor.prototype</code> в цепочке прототипов <code>object</code>.</p> + +<div>{{EmbedInteractiveExample("pages/js/expressions-instanceof.html")}}</div> + +<h2 id="Синтаксис">Синтаксис</h2> + +<pre class="syntaxbox"><em>object</em> instanceof <em>constructor</em></pre> + +<h3 id="Параметры">Параметры</h3> + +<dl> + <dt><code>object</code></dt> + <dd>Проверяемый объект.</dd> +</dl> + +<dl> + <dt><code>constructor</code></dt> + <dd>Функция-конструктор, на которую идёт проверка.</dd> +</dl> + +<h2 id="Описание">Описание</h2> + +<p>Оператор <code>instanceof</code> проверяет, присутствует ли объект <code>constructor.prototype</code> в цепочке прототипов <code>object</code>.</p> + +<pre class="brush: js">// объявляем конструкторы +function C() {} +function D() {} + +var o = new C(); + +// true, так как: Object.getPrototypeOf(o) === C.prototype +o instanceof C; + +// false, так как D.prototype не присутствует в цепочке прототипов o +o instanceof D; + +o instanceof Object; // true, так как: +C.prototype instanceof Object // true + +C.prototype = {}; +var o2 = new C(); + +o2 instanceof C; // true + +// false, так как C.prototype отсутствует в цепочке прототипов o +o instanceof C; + +D.prototype = new C(); // add C to [[Prototype]] linkage of D +var o3 = new D(); +o3 instanceof D; // true +o3 instanceof C; // true, так как C.prototype теперь присутствует в цепочке прототипов o3 +</pre> + +<p>Обратите внимание: результат оператора <code>instanceof</code> зависит от свойства <code>constructor.prototype</code>, поэтому результат оператора может поменяться после изменения этого свойства. Также результат может поменяться после изменения прототипа <code>object</code> (или цепочки прототипов) с помощью <code>Object.setPrototypeOf</code> или нестандартного свойства <code>__proto__</code>.</p> + +<h3 id="instanceof_и_множественные_контексты_(например_фреймы_или_окна)"><code>instanceof</code> и множественные контексты (например, фреймы или окна)</h3> + +<p>Различные контексты имеют разные среды выполнения. Это означает, что они имеют различныые built-ins (разный глобальный объект, различные конструкторы и т.д.). Это может давать неожиданные результаты. Например, <code>[] instanceof window.frames[0].Array</code> вернёт <code>false</code>, потому что <code>Array.prototype !== </code><code>window.frames[0].Array</code> а массив наследуется от <code>Array</code>.</p> + +<p>Это может казаться несущественной проблемой сначала, но при работе с несколькими фреймами или окнами, и передачи объектов из одного контекста в другой с помощью функций, это может стать серьёзной проблемой. С другой стороны, безопасно проверить, является ли некоторый объект массивом можно используя <code>Array.isArray(myObj)</code>.</p> + +<p>Например, для проверки того, что <a href="/ru/docs/Web/API/Node">Node</a> является <a href="/ru/docs/Web/API/SVGElement">SVGElement</a> в разных контекстах можно использовать <code>myNode instanceof myNode.ownerDocument.defaultView.SVGElement</code>.</p> + +<div class="note"><strong>Замечания для разработчиков Mozilla:</strong><br> +Использование XPCOM <code>instanceof</code> в коде имеет специальный эффект: <code>obj instanceof </code><em><code>xpcomInterface</code></em> (например <code>Components.interfaces.nsIFile</code>) вызывает <code>obj.QueryInterface(<em>xpcomInterface</em>)</code> и возвращает <code>true</code> если проверка на QueryInterface прошла успешно. Побочным эфектом этого вызова является то, что можно использовать свойства <em><code>xpcomInterface</code></em> на <code>obj</code> после успешной проверки с помощью <code>instanceof</code>. В отличии от стандартных глобальных JavaScript типов, проверка <code>obj instanceof xpcomInterface</code> работает как ожидается, даже если <code>obj</code> отнсится к другому контексту.</div> + +<h2 id="Примеры">Примеры</h2> + +<h3 id="Показывает_что_String_и_Date_имеют_тип_Object_и_граничные_случаи">Показывает, что <code>String</code> и <code>Date</code> имеют тип <code>Object</code> и граничные случаи</h3> + +<p>Следующий код использует <code>instanceof</code>, чтобы показать что объекты <code>String</code> и <code>Date</code> также имеют тип <code>Object</code> (они являются наследниками <code>Object</code>).</p> + +<p>Однако, объекты, созданные с помощью литералов, являются исключениями — хотя их prototype равен <code>undefined</code>, выражение <code>instanceof Object</code> возвращает <code>true</code>.</p> + +<pre class="brush: js">var simpleStr = 'Это обычная строка'; +var myString = new String(); +var newStr = new String('Строка, созданная с помощью конструктора'); +var myDate = new Date(); +var myObj = {}; + +simpleStr instanceof String; // возвращает false, проверяет цепочку прототипов +myString instanceof String; // возвращает true +newStr instanceof String; // возвращает true +myString instanceof Object; // возвращает true + +myObj instanceof Object; // возвращает true, несмотря на прототип, равный undefined +({}) instanceof Object; // возвращает true, аналогично предыдущей строчке + +myString instanceof Date; // возвращает false + +myDate instanceof Date; // возвращает true +myDate instanceof Object; // возвращает true +myDate instanceof String; // возвращает false +</pre> + +<h3 id="Показывает_что_mycar_имеет_тип_Car_и_тип_Object">Показывает, что <code>mycar</code> имеет тип <code>Car</code> и тип <code>Object</code></h3> + +<p>Следующий код создает тип <code>Car</code> и экземпляр этого типа, <code>mycar</code>. Оператор <code>instanceof</code> показывает, что объект <code>mycar</code> имеет тип <code>Car</code> и тип <code>Object</code>.</p> + +<pre class="brush: js">function Car(make, model, year) { + this.make = make; + this.model = model; + this.year = year; +} +var mycar = new Car('Honda', 'Accord', 1998); +var a = mycar instanceof Car; // возвращает true +var b = mycar instanceof Object; // возвращает true +</pre> + +<h2 id="Спецификации">Спецификации</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Спецификация</th> + <th scope="col">Статус</th> + <th scope="col">Комментарий</th> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-relational-operators', 'Relational Operators')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-relational-operators', 'Relational Operators')}}</td> + <td>{{Spec2('ES6')}}</td> + <td> </td> + </tr> + <tr> + <td>{{SpecName('ES5.1', '#sec-11.8.6', 'The instanceof operator')}}</td> + <td>{{Spec2('ES5.1')}}</td> + <td> </td> + </tr> + <tr> + <td>{{SpecName('ES3', '#sec-11.8.6', 'The instanceof operator')}}</td> + <td>{{Spec2('ES3')}}</td> + <td>Изначальное определение. Реализована в JavaScript 1.4.</td> + </tr> + </tbody> +</table> + +<h2 id="Поддержка_браузерами">Поддержка браузерами</h2> + +<p>{{Compat("javascript.operators.instanceof")}}</p> + +<h2 id="См._также">См. также</h2> + +<ul> + <li><code><a href="/ru/docs/Web/JavaScript/Reference/Operators/typeof" title="/en-US/docs/JavaScript/Reference/Operators/typeof">typeof</a></code></li> + <li>{{jsxref("Symbol.hasInstance")}}</li> +</ul> |