uTools-Manuals/docs/javascript/Reference/Errors/Not_a_constructor.html

64 lines
6.4 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<article id="wikiArticle">
<div></div>
<h2 id="信息">信息</h2>
<pre><code class="language-javascript">TypeError: "x" is not a constructor
TypeError: Math is not a constructor
TypeError: JSON is not a constructor
TypeError: Symbol is not a constructor
TypeError: Reflect is not a constructor
TypeError: Intl is not a constructor
TypeError: SIMD is not a constructor
TypeError: Atomics is not a constructor
</code></pre>
<h2 id="错误类型">错误类型</h2>
<p><a href="Reference/Global_Objects/TypeError" title="TypeError类型错误 对象用来表示值的类型非预期类型时发生的错误。"><code>TypeError</code></a></p>
<h2 id="哪里出错了">哪里出错了?</h2>
<p>是因为尝试将不是构造器的对象或者变量来作为构造器使用。参考 <a class="glossaryLink" href="/en-US/docs/Glossary/constructor" title="constructor: A constructor belongs to a particular class object that is instantiated. The constructor initializes this object and can provide access to its private information. The concept of a constructor can be applied to most object-oriented programming languages. Essentially, a constructor in JavaScript is usually declared at the instance of a class.">constructor</a> 或者 <a href="Reference/Operators/new"><code>new</code> operator</a> 来了解什么是构造器。</p>
<p>有很多的全局对象比如 <a href="Reference/String" title="此页面仍未被本地化, 期待您的翻译!"><code>String</code></a><a href="Reference/Array" title="REDIRECT Array"><code>Array</code></a> 等等都是可以使用 <code>new</code> 操作符的构造器。但是有一些全局对象并不是,且其属性和方法都是<a class="external" href="https://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods" rel="noopener">静态</a>的。下面的 JavaScript 标准内置对象都不是构造器:<a href="Reference/Global_Objects/Math" title="Math 是一个内置对象 它具有数学常数和函数的属性和方法。不是一个函数对象。"><code>Math</code></a><a href="Reference/Global_Objects/JSON" title="JSON对象包含两个方法: 用于解析 JavaScript Object Notation  (JSON) 的 parse() 方法,以及将对象/值转换为 JSON字符串的 stringify() 方法。除了这两个方法, JSON这个对象本身并没有其他作用也不能被调用或者作为构造函数调用。"><code>JSON</code></a><a href="Reference/Global_Objects/Symbol" title='Symbol()函数会返回symbol类型的值该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象它的静态方法会暴露全局的symbol注册且类似于内建对象类但作为构造函数来说它并不完整因为它不支持语法"new Symbol()"。'><code>Symbol</code></a><a href="Reference/Global_Objects/Reflect" title="Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与处理器对象的方法相同。Reflect不是一个函数对象因此它是不可构造的。"><code>Reflect</code></a><a href="Reference/Global_Objects/Intl" title="国际化的构造函数和其他构造函数的几个语言敏感的方法可见See also一样使用同样的模式来识别语言区域和确定使用哪一种语言格式他们都接收 locales 和 options 参数,使用 options.localeMatcher 属性指定的一个算法来对比应用请求的和支持的语言区域,来确定使用哪一个语言区域。"><code>Intl</code></a><a class="new" href="Reference/SIMD" rel="nofollow" title="此页面仍未被本地化, 期待您的翻译!"><code>SIMD</code></a><a href="Reference/Global_Objects/Atomics" title="Atomics 对象提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作。"><code>Atomics</code></a></p>
<p><a href="Reference/Statements/function*">Generator functions</a> 也不能作为构造器来使用。</p>
<h2 id="示例">示例</h2>
<h3 id="无效的">无效的</h3>
<pre><code class="language-js example-bad">var Car = 1;
new Car();
// TypeError: Car is not a constructor
new Math();
// TypeError: Math is not a constructor
new Symbol();
// TypeError: Symbol is not a constructor
function* f() {};
var obj = new f;
// TypeError: f is not a constructor
</code></pre>
<h3 id="一个构造器">一个构造器</h3>
<p>假设你想为汽车创建一个对象类型。 你希望此类型的对象被称为 <code>car</code>并且您希望它具有makemodel 和 year 属性。 为此,你编写以下函数:</p>
<pre><code class="language-javascript">function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
</code></pre>
<p>现在你可以创建一个名为 <code>mycar</code> 的对象,如下所示:</p>
<pre><code class="language-javascript">var mycar = new Car("Eagle", "Talon TSi", 1993);</code></pre>
<h3 id="关于_Promises">关于 Promises </h3>
<p>当返回了一个 immediately-resolved 或者 immediately-rejected Promise 的时候,你根本不需要去创建、操作一个新的 Promise 对象。</p>
<p>这是不合法的(<a href="/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Promise#Constructor">Promise constructor</a> 被错误的调用了)且会抛出一个 错误 <code>TypeError: this is not a constructor</code> exception:</p>
<pre><code class="language-js example-bad">return new Promise.resolve(true);
</code></pre>
<p>使用<a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve"> Promise.resolve()</a> 或者 <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject">Promise.reject()</a> 静态方法来代替:</p>
<pre><code class="language-javascript">// 这是合法的,但是没必要这么长:
return new Promise((resolve, reject) =&gt; { resolve(true); })
// 用静态方法来代替:
return Promise.resolve(true);
return Promise.reject(false);
</code></pre>
<h2 id="相关链接">相关链接</h2>
<ul>
<li><a class="glossaryLink" href="/en-US/docs/Glossary/constructor" title="constructor: A constructor belongs to a particular class object that is instantiated. The constructor initializes this object and can provide access to its private information. The concept of a constructor can be applied to most object-oriented programming languages. Essentially, a constructor in JavaScript is usually declared at the instance of a class.">constructor</a></li>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Operators/new"><code>new</code> operator</a></li>
</ul>
</article>