mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-09 23:44:06 +08:00
232 lines
15 KiB
HTML
232 lines
15 KiB
HTML
<article id="wikiArticle">
|
||
<div></div>
|
||
<p><strong><code>Object.create()</code></strong>方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 (请打开浏览器控制台以查看运行结果。)</p>
|
||
<p><iframe class="interactive interactive-js" frameborder="0" height="250" src="https://interactive-examples.mdn.mozilla.net/pages/js/object-create.html" width="100%"></iframe></p>
|
||
<div class="hidden">The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone <a class="external" href="https://github.com/mdn/interactive-examples" rel="noopener">https://github.com/mdn/interactive-examples</a> and send us a pull request.</div>
|
||
<h2 id="Syntax" name="Syntax">语法</h2>
|
||
<pre>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>可选。如果没有指定为 <a href="Reference/Global_Objects/undefined" title="undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined。"><code>undefined</code></a>,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应<a href="Reference/Global_Objects/Object/defineProperties" title="Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。"><code>Object.defineProperties()</code></a>的第二个参数。</dd>
|
||
</dl>
|
||
<h3 id="Parameters" name="Parameters">返回值</h3>
|
||
<p>一个新对象,带着指定的原型对象和属性。</p>
|
||
<h3 id="Description" name="Description">例外</h3>
|
||
<p>如果<code>propertiesObject</code>参数不是 <a href="Reference/Global_Objects/null" title="值 null 特指对象的值未设置。它是 JavaScript 基本类型 之一。"><code>null</code></a> 或一个对象,则抛出一个 <a href="Reference/Global_Objects/TypeError" title="TypeError(类型错误) 对象用来表示值的类型非预期类型时发生的错误。"><code>TypeError</code></a> 异常。</p>
|
||
<h2 id="Examples" name="Examples">例子</h2>
|
||
<h3 id="用_Object.create实现类式继承">用 <code>Object.create</code>实现类式继承</h3>
|
||
<p>下面的例子演示了如何使用<code>Object.create()</code>来实现类式继承。这是一个所有版本JavaScript都支持的单继承。</p>
|
||
<pre><code class="language-javascript">// Shape - 父类(superclass)
|
||
function Shape() {
|
||
this.x = 0;
|
||
this.y = 0;
|
||
}
|
||
|
||
// 父类的方法
|
||
Shape.prototype.move = function(x, y) {
|
||
this.x += x;
|
||
this.y += y;
|
||
console.info('Shape moved.');
|
||
};
|
||
|
||
// Rectangle - 子类(subclass)
|
||
function Rectangle() {
|
||
Shape.call(this); // call super constructor.
|
||
}
|
||
|
||
// 子类续承父类
|
||
Rectangle.prototype = Object.create(Shape.prototype);
|
||
Rectangle.prototype.constructor = Rectangle;
|
||
|
||
var rect = new Rectangle();
|
||
|
||
console.log('Is rect an instance of Rectangle?',
|
||
rect instanceof Rectangle); // true
|
||
console.log('Is rect an instance of Shape?',
|
||
rect instanceof Shape); // true
|
||
rect.move(1, 1); // Outputs, 'Shape moved.'</code></pre>
|
||
<p>如果你希望能继承到多个对象,则可以使用<span class="short_text" id="result_box" lang="zh-CN"><span>混入的方式。</span></span></p>
|
||
<pre><code class="language-javascript">function MyClass() {
|
||
SuperClass.call(this);
|
||
OtherSuperClass.call(this);
|
||
}
|
||
|
||
// 继承一个类
|
||
MyClass.prototype = Object.create(SuperClass.prototype);
|
||
// 混合其它
|
||
Object.assign(MyClass.prototype, OtherSuperClass.prototype);
|
||
// 重新指定constructor
|
||
MyClass.prototype.constructor = MyClass;
|
||
|
||
MyClass.prototype.myMethod = function() {
|
||
// do a thing
|
||
};
|
||
</code></pre>
|
||
<p><a href="https://developer.mozilla.orgReference/Global_Objects/Object/assign">Object.assign</a> 会把 <code>OtherSuperClass</code>原型上的函数拷贝到 <code>MyClass</code>原型上,使 MyClass 的所有实例都可用 OtherSuperClass 的方法。Object.assign 是在 ES2015 引入的,且可用<a href="Reference/Global_Objects/Object/assign#Polyfill"> polyfilled</a>。要支持旧浏览器的话,可用使用 <a class="external" href="https://api.jquery.com/jQuery.extend/" rel="noopener">jQuery.extend()</a> 或者 <a class="external" href="https://lodash.com/docs/#assign" rel="noopener">_.assign()</a>。</p>
|
||
<h3 id="使用_Object.create_的_propertyObject参数" style="line-height: 18px;">使用 <code>Object.create</code> 的 <code>propertyObject</code>参数</h3>
|
||
<pre><code class="language-javascript">var o;
|
||
|
||
// 创建一个原型为null的空对象
|
||
o = Object.create(null);
|
||
|
||
|
||
o = {};
|
||
// 以字面量方式创建的空对象就相当于:
|
||
o = Object.create(Object.prototype);
|
||
|
||
|
||
o = Object.create(Object.prototype, {
|
||
// foo会成为所创建对象的数据属性
|
||
foo: {
|
||
writable:true,
|
||
configurable:true,
|
||
value: "hello"
|
||
},
|
||
// bar会成为所创建对象的访问器属性
|
||
bar: {
|
||
configurable: false,
|
||
get: function() { return 10 },
|
||
set: function(value) {
|
||
console.log("Setting `o.bar` to", value);
|
||
}
|
||
}
|
||
});
|
||
|
||
|
||
function Constructor(){}
|
||
o = new Constructor();
|
||
// 上面的一句就相当于:
|
||
o = Object.create(Constructor.prototype);
|
||
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码
|
||
|
||
|
||
// 创建一个以另一个空对象为原型,且拥有一个属性p的对象
|
||
o = Object.create({}, { p: { value: 42 } })
|
||
|
||
// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
|
||
o.p = 24
|
||
o.p
|
||
//42
|
||
|
||
o.q = 12
|
||
for (var prop in o) {
|
||
console.log(prop)
|
||
}
|
||
//"q"
|
||
|
||
delete o.p
|
||
//false
|
||
|
||
//创建一个可写的,可枚举的,可配置的属性p
|
||
o2 = Object.create({}, {
|
||
p: {
|
||
value: 42,
|
||
writable: true,
|
||
enumerable: true,
|
||
configurable: true
|
||
}
|
||
});</code></pre>
|
||
<h2 id="Polyfill" style="line-height: 24px;">Polyfill</h2>
|
||
<p>这个 polyfill 涵盖了主要的应用场景,它创建一个已经选择了原型的新对象,但没有把第二个参数考虑在内。</p>
|
||
<p>请注意,尽管在 ES5 中 <code>Object.create</code>支持设置为<code>[[Prototype]]</code>为<code>null</code>,但因为那些ECMAScript5以前版本限制,此 polyfill 无法支持该特性。</p>
|
||
<pre>if (typeof Object.create !== "function") {
|
||
Object.create = function (proto, propertiesObject) {
|
||
if (typeof proto !== 'object' && typeof proto !== 'function') {
|
||
throw new TypeError('Object prototype may only be an Object: ' + proto);
|
||
} else if (proto === null) {
|
||
throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");
|
||
}
|
||
|
||
if (typeof propertiesObject != 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");
|
||
|
||
function F() {}
|
||
F.prototype = proto;
|
||
|
||
return new F();
|
||
};
|
||
}</code></pre>
|
||
<h2 id="规范" style="margin-bottom: 20px; line-height: 30px;">规范</h2>
|
||
<table class="standard-table">
|
||
<tbody>
|
||
<tr>
|
||
<th scope="col">Specification</th>
|
||
<th scope="col">Status</th>
|
||
<th scope="col">Comment</th>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.5" hreflang="en" lang="en" rel="noopener">ECMAScript 5.1 (ECMA-262)<br/><small lang="zh-CN">Object.create</small></a></td>
|
||
<td><span class="spec-Standard">Standard</span></td>
|
||
<td>Initial definition. Implemented in JavaScript 1.8.5.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://www.ecma-international.org/ecma-262/6.0/#sec-object.create" hreflang="en" lang="en" rel="noopener">ECMAScript 2015 (6th Edition, ECMA-262)<br/><small lang="zh-CN">Object.create</small></a></td>
|
||
<td><span class="spec-Standard">Standard</span></td>
|
||
<td> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://tc39.github.io/ecma262/#sec-object.create" hreflang="en" lang="en" rel="noopener">ECMAScript Latest Draft (ECMA-262)<br/><small lang="zh-CN">Object.create</small></a></td>
|
||
<td><span class="spec-Draft">Draft</span></td>
|
||
<td> </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h2 id="浏览器兼容">浏览器兼容</h2>
|
||
<div class="hidden">The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a class="external" href="https://github.com/mdn/browser-compat-data" rel="noopener">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</div>
|
||
<p></p><div class="bc-data"><a class="bc-github-link external" href="https://github.com/mdn/browser-compat-data" rel="noopener">Update compatibility data on GitHub</a><table class="bc-table bc-table-js"><thead><tr class="bc-platforms"><td></td><th class="bc-platform-desktop" colspan="6"><span>Desktop</span></th><th class="bc-platform-mobile" colspan="7"><span>Mobile</span></th><th class="bc-platform-server" colspan="1"><span>Server</span></th></tr><tr class="bc-browsers"><td></td><th class="bc-browser-chrome"><span class="bc-head-txt-label bc-head-icon-chrome">Chrome</span></th><th class="bc-browser-edge"><span class="bc-head-txt-label bc-head-icon-edge">Edge</span></th><th class="bc-browser-firefox"><span class="bc-head-txt-label bc-head-icon-firefox">Firefox</span></th><th class="bc-browser-ie"><span class="bc-head-txt-label bc-head-icon-ie">Internet Explorer</span></th><th class="bc-browser-opera"><span class="bc-head-txt-label bc-head-icon-opera">Opera</span></th><th class="bc-browser-safari"><span class="bc-head-txt-label bc-head-icon-safari">Safari</span></th><th class="bc-browser-webview_android"><span class="bc-head-txt-label bc-head-icon-webview_android">Android webview</span></th><th class="bc-browser-chrome_android"><span class="bc-head-txt-label bc-head-icon-chrome_android">Chrome for Android</span></th><th class="bc-browser-edge_mobile"><span class="bc-head-txt-label bc-head-icon-edge_mobile">Edge Mobile</span></th><th class="bc-browser-firefox_android"><span class="bc-head-txt-label bc-head-icon-firefox_android">Firefox for Android</span></th><th class="bc-browser-opera_android"><span class="bc-head-txt-label bc-head-icon-opera_android">Opera for Android</span></th><th class="bc-browser-safari_ios"><span class="bc-head-txt-label bc-head-icon-safari_ios">Safari on iOS</span></th><th class="bc-browser-samsunginternet_android"><span class="bc-head-txt-label bc-head-icon-samsunginternet_android">Samsung Internet</span></th><th class="bc-browser-nodejs"><span class="bc-head-txt-label bc-head-icon-nodejs">Node.js</span></th></tr></thead><tbody><tr><th scope="row"><code>create</code></th><td class="bc-supports-yes bc-browser-chrome"><span class="bc-browser-name">Chrome</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
5</td><td class="bc-supports-yes bc-browser-edge"><span class="bc-browser-name">Edge</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
12</td><td class="bc-supports-yes bc-browser-firefox"><span class="bc-browser-name">Firefox</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
4</td><td class="bc-supports-yes bc-browser-ie"><span class="bc-browser-name">IE</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
9</td><td class="bc-supports-yes bc-browser-opera"><span class="bc-browser-name">Opera</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
11.6</td><td class="bc-supports-yes bc-browser-safari"><span class="bc-browser-name">Safari</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
5</td><td class="bc-supports-yes bc-browser-webview_android"><span class="bc-browser-name">WebView Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-chrome_android"><span class="bc-browser-name">Chrome Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-edge_mobile"><span class="bc-browser-name">Edge Mobile</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-firefox_android"><span class="bc-browser-name">Firefox Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
4</td><td class="bc-supports-yes bc-browser-opera_android"><span class="bc-browser-name">Opera Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
11.5</td><td class="bc-supports-yes bc-browser-safari_ios"><span class="bc-browser-name">Safari iOS</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-samsunginternet_android"><span class="bc-browser-name">Samsung Internet Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-nodejs"><span class="bc-browser-name">nodejs</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td></tr></tbody></table><section class="bc-legend" id="sect1"><h3 class="offscreen" id="Legend">Legend</h3><dl><dt><span class="bc-supports-yes bc-supports">
|
||
<abbr class="bc-level bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
|
||
</abbr></span></dt><dd>Full support</dd></dl></section></div><p></p>
|
||
<h2 id="See_also" name="See_also" style="margin-bottom: 20px; line-height: 30px;">相关链接</h2>
|
||
<ul>
|
||
<li><a href="Reference/Global_Objects/Object/defineProperty" title="Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。"><code>Object.defineProperty</code></a></li>
|
||
<li><a href="Reference/Global_Objects/Object/defineProperties" title="Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。"><code>Object.defineProperties</code></a></li>
|
||
<li><a href="Reference/Global_Objects/Object/isPrototypeOf" title="isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。"><code>Object.prototype.isPrototypeOf</code></a></li>
|
||
<li>John Resig's post on <a class="external external-icon" href="http://ejohn.org/blog/objectgetprototypeof/" rel="noopener" style="white-space: pre-line;" title="http://ejohn.org/blog/objectgetprototypeof/">getPrototypeOf</a></li>
|
||
</ul>
|
||
</article> |