aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/javascript/reference/operators/instanceof
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
commit33058f2b292b3a581333bdfb21b8f671898c5060 (patch)
tree51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/javascript/reference/operators/instanceof
parent8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff)
downloadtranslated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz
translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2
translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip
initial commit
Diffstat (limited to 'files/zh-cn/web/javascript/reference/operators/instanceof')
-rw-r--r--files/zh-cn/web/javascript/reference/operators/instanceof/index.html186
1 files changed, 186 insertions, 0 deletions
diff --git a/files/zh-cn/web/javascript/reference/operators/instanceof/index.html b/files/zh-cn/web/javascript/reference/operators/instanceof/index.html
new file mode 100644
index 0000000000..c97b2a72a4
--- /dev/null
+++ b/files/zh-cn/web/javascript/reference/operators/instanceof/index.html
@@ -0,0 +1,186 @@
+---
+title: instanceof
+slug: Web/JavaScript/Reference/Operators/instanceof
+tags:
+ - JavaScript
+ - instanceof
+ - 原型
+ - 原型链
+ - 对象
+ - 操作符
+translation_of: Web/JavaScript/Reference/Operators/instanceof
+---
+<div>{{jsSidebar("Operators")}}</div>
+
+<p><strong><code>instanceof</code></strong> <strong>运算符</strong>用于检测构造函数的 <code>prototype</code> 属性是否出现在某个实例对象的原型链上。</p>
+
+<div>{{EmbedInteractiveExample("pages/js/expressions-instanceof.html")}}</div>
+
+
+
+<h2 id="Syntax" name="Syntax">语法</h2>
+
+<pre><code><em>object</em> instanceof <em>constructor</em></code></pre>
+
+<h3 id="Parameters" name="Parameters">参数</h3>
+
+<dl>
+ <dt><code>object</code></dt>
+ <dd>某个实例对象</dd>
+</dl>
+
+<dl>
+ <dt><code>constructor</code></dt>
+ <dd>某个构造函数</dd>
+</dl>
+
+<h2 id="Description" name="Description">描述</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();
+
+
+o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
+
+
+o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
+
+o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
+C.prototype instanceof Object // true,同上
+
+C.prototype = {};
+var o2 = new C();
+
+o2 instanceof C; // true
+
+o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
+
+D.prototype = new C(); // 继承
+var o3 = new D();
+o3 instanceof D; // true
+o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上
+</pre>
+
+<p>需要注意的是,如果表达式 <code>obj instanceof Foo</code> 返回 <code>true</code>,则并不意味着该表达式会永远返回 <code>true</code>,因为 <code>Foo.prototype</code> 属性的值有可能会改变,改变之后的值很有可能不存在于 <code>obj</code> 的原型链上,这时原表达式的值就会成为 <code>false</code>。另外一种情况下,原表达式的值也会改变,就是改变对象 <code>obj</code> 的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的 <code>__proto__</code> 伪属性,是可以实现的。比如执行 <code>obj.__proto__ = {}</code> 之后,<code>obj instanceof Foo</code> 就会返回 <code>false</code> 了。</p>
+
+<h3 id="instanceof_和多全局对象例如:多个_frame_或多个_window_之间的交互"><code>instanceof</code> 和多全局对象(例如:多个 frame 或多个 window 之间的交互)</h3>
+
+<p>在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。比如,表达式 <code>[] instanceof window.frames[0].Array</code> 会返回 <code>false</code>,因为 <code>Array.prototype !== window.frames[0].Array.prototype</code>,并且数组从前者继承。</p>
+
+<p>起初,你会认为这样并没有意义,但是当你在你的脚本中开始处理多个 frame 或多个 window 以及通过函数将对象从一个窗口传到另一个窗口时,这就是一个有效而强大的话题。比如,实际上你可以通过使用<code>Array.isArray(myObj)</code> 或者<code>Object.prototype.toString.call(myObj) === "[object Array]"</code> 来安全的检测传过来的对象是否是一个数组。</p>
+
+<p>比如检测一个 <code>Nodes</code> 在另一个窗口中是不是 <code>SVGElement</code>,你可以使用<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> (e.g. <code>Components.interfaces.nsIFile</code>) 调用<code>obj.QueryInterface(<em>xpcomInterface</em>)</code> 并且返回 <code>true</code> 。这种调用的副作用是在一次成功的 <code>instanceof</code> 测试后,你可以在 <code>obj</code> 上使用<code>xpcomInterface</code> 的属性。这与标准的 <code>JavaScript</code> 全局变量不同,即使 <code>obj</code> 来自不同的作用域,<code>obj instanceof xpcomInterface</code> 也可以按预期产生作用。</div>
+
+<h2 id="Examples" name="Examples">示例</h2>
+
+<h3 id="Example_Demonstrating_that_String_and_Date_are_of_type_Object" name="Example:_Demonstrating_that_String_and_Date_are_of_type_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>但是,使用对象文字符号创建的对象在这里是一个例外:虽然原型未定义,但 <code>instanceof Object</code> 返回 <code>true</code>。</p>
+
+<pre class="brush: js">var simpleStr = "This is a simple string";
+var myString = new String();
+var newStr = new String("String created with constructor");
+var myDate = new Date();
+var myObj = {};
+var myNonObj = Object.create(null);
+
+simpleStr instanceof String; // 返回 false, 检查原型链会找到 undefined
+myString instanceof String; // 返回 true
+newStr instanceof String; // 返回 true
+myString instanceof Object; // 返回 true
+
+myObj instanceof Object; // 返回 true, 尽管原型没有定义
+({}) instanceof Object; // 返回 true, 同上
+myNonObj instanceof Object; // 返回 false, 一种创建非 Object 实例的对象的方法
+
+myString instanceof Date; //返回 false
+
+myDate instanceof Date; // 返回 true
+myDate instanceof Object; // 返回 true
+myDate instanceof String; // 返回 false</pre>
+
+<h3 id="Example_Demonstrating_that_mycar_is_of_type_Car_and_type_Object" name="Example:_Demonstrating_that_mycar_is_of_type_Car_and_type_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" dir="rtl">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>
+
+<h3 id="不是...的实例">不是...的实例</h3>
+
+<p>要检测对象不是某个构造函数的实例时,你可以这样做</p>
+
+<pre class="brush: js">if (!(mycar instanceof Car)) {
+ // Do something, like mycar = new Car(mycar)
+}</pre>
+
+<p>这和以下代码完全不同</p>
+
+<pre class="brush: js">if (!mycar instanceof Car)</pre>
+
+<p>这段代码永远会得到 <code>false</code>(<code>!mycar</code> 将在 <code>instanceof</code> 之前被处理,所以你总是在验证一个布尔值是否是 <code>Car</code> 的一个实例)。</p>
+
+<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>Initial definition. Implemented in JavaScript 1.4.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="浏览器兼容性">浏览器兼容性</h2>
+
+<div class="hidden">
+<p>The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>
+</div>
+
+<p>{{Compat("javascript.operators.instanceof")}}</p>
+
+<h2 id="See_also" name="See_also">相关链接</h2>
+
+<ul>
+ <li><a href="/zh-CN/docs/JavaScript/Reference/Operators/typeof" title="/zh-CN/docs/JavaScript/Reference/Operators/typeof">typeof</a></li>
+ <li>{{jsxref("Symbol.hasInstance")}}</li>
+</ul>