Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 577339 of Object.create()

  • 版本网址缩略名: JavaScript/Reference/Global_Objects/Object/create
  • 版本标题: create
  • 版本 id: 577339
  • 创建于:
  • 创建者: teoli
  • 是否是当前版本?
  • 评论 JS-ref/Global_Objects/Object/create JavaScript/Reference/Global_Objects/Object/create

修订内容

概述

创建一个拥有指定原型和若干个指定属性的对象.

Method of Object
Implemented in JavaScript 1.8.5
ECMAScript Edition ECMAScript 5th Edition

语法

Object.create(proto [, propertiesObject ])

参数

proto
一个对象,作为新创建对象的原型.
propertiesObject
一个对象值,可以包含若干个属性,属性名为新建对象的属性名,属性值为那个属性的属性描述符对象.

描述

如果proto参数的值不是null或者对象值,则会TypeError异常.

例子

使用Object.create

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 } });

使用Object.create实现原型继承

下面的例子演示了如何使用Object.create来实现单继承.

//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);

var rect = new Rectangle();

rect instanceof Rectangle //true.
rect instanceof Shape //true.

rect.move(); //Outputs, "Shape moved."

如果你希望能继承到多个对象,则可以使用混入的方式.

function MyClass() {
     SuperClass.call(this);
     OtherSuperClass.call(this);
}

MyClass.prototype = Object.create(SuperClass.prototype); //inherit
mixin(MyClass.prototype, OtherSuperClass.prototype); //mixin

MyClass.prototype.myMethod = function() {
     // do a thing
};

mixin函数会把超类原型上的函数拷贝到子类原型上,这里mixin函数没有给出,需要由你实现.

浏览器兼容性

{{ CompatibilityTable() }}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 5 {{ CompatGeckoDesktop("2") }} 9 11.60 5
Feature Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
Basic support {{ CompatGeckoDesktop("2") }} {{ CompatVersionUnknown() }} {{ CompatUnknown() }} 11.50 {{ CompatVersionUnknown() }}

Polyfill

if (!Object.create) {
    Object.create = function (o) {
        if (arguments.length > 1) {
            throw new Error('Object.create implementation only accepts the first parameter.');
        }
        function F() {}
        F.prototype = o;
        return new F();
    };
}

这个polyfill只实现了创建一个指定原型的对象的功能,而不能同时添加特定的属性,也就是没有实现原生的Object.create函数中的第二个参数.

相关链接

修订版来源

<h2 id="Summary" name="Summary">概述</h2>
<p>创建一个拥有指定原型和若干个指定属性的对象.</p>
<table class="standard-table">
  <thead>
    <tr>
      <th class="header" colspan="2">Method of <a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Object" title="JavaScript/Reference/Global_Objects/Object"><code>Object</code></a></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Implemented in</td>
      <td>JavaScript 1.8.5</td>
    </tr>
    <tr>
      <td>ECMAScript Edition</td>
      <td>ECMAScript 5th Edition</td>
    </tr>
  </tbody>
</table>
<h2 id="Syntax" name="Syntax">语法</h2>
<pre class="syntaxbox"><code>Object.create(<em>proto</em> [, <em>propertiesObject</em> ])</code></pre>
<h2 id="Parameters" name="Parameters">参数</h2>
<dl>
  <dt>
    proto</dt>
  <dd>
    一个对象,作为新创建对象的原型.</dd>
  <dt>
    propertiesObject</dt>
  <dd>
    一个对象值,可以包含若干个属性,属性名为新建对象的属性名,属性值为那个属性的属性描述符对象.</dd>
</dl>
<h2 id="Description" name="Description">描述</h2>
<p>如果proto参数的值不是null或者对象值,则会<code>TypeError</code>异常.</p>
<h2 id="Examples" name="Examples">例子</h2>
<h4 id=".E4.BD.BF.E7.94.A8Object.create">使用Object.create</h4>
<pre class="brush: js">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 } });
</pre>
<h4 id=".E4.BD.BF.E7.94.A8Object.create.E5.AE.9E.E7.8E.B0.E5.8E.9F.E5.9E.8B.E7.BB.A7.E6.89.BF">使用Object.create实现原型继承</h4>
<p>下面的例子演示了如何使用Object.create来实现单继承.</p>
<div class="highlight">
  <pre class="brush: js">//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);

var rect = new Rectangle();

rect instanceof Rectangle //true.
rect instanceof Shape //true.

rect.move(); //Outputs, "Shape moved."
</pre>
</div>
<p>如果你希望能继承到多个对象,则可以使用<span class="short_text" id="result_box" lang="zh-CN"><span>混入的方式</span></span>.</p>
<div class="highlight">
  <pre class="brush: js">function MyClass() {
     SuperClass.call(this);
     OtherSuperClass.call(this);
}

MyClass.prototype = Object.create(SuperClass.prototype); //inherit
mixin(MyClass.prototype, OtherSuperClass.prototype); //mixin

MyClass.prototype.myMethod = function() {
     // do a thing
};
</pre>
</div>
<p>mixin函数会把超类原型上的函数拷贝到子类原型上,这里mixin函数没有给出,需要由你实现.</p>
<h2 id=".E6.B5.8F.E8.A7.88.E5.99.A8.E5.85.BC.E5.AE.B9.E6.80.A7">浏览器兼容性</h2>
<p>{{ CompatibilityTable() }}</p>
<div id="compat-desktop">
  <table class="compat-table">
    <tbody>
      <tr>
        <th>Feature</th>
        <th>Chrome</th>
        <th>Firefox (Gecko)</th>
        <th>Internet Explorer</th>
        <th>Opera</th>
        <th>Safari</th>
      </tr>
      <tr>
        <td>Basic support</td>
        <td>5</td>
        <td>{{ CompatGeckoDesktop("2") }}</td>
        <td>9</td>
        <td>11.60</td>
        <td>5</td>
      </tr>
    </tbody>
  </table>
</div>
<div id="compat-mobile">
  <table class="compat-table">
    <tbody>
      <tr>
        <th>Feature</th>
        <th>Firefox Mobile (Gecko)</th>
        <th>Android</th>
        <th>IE Mobile</th>
        <th>Opera Mobile</th>
        <th>Safari Mobile</th>
      </tr>
      <tr>
        <td>Basic support</td>
        <td>{{ CompatGeckoDesktop("2") }}</td>
        <td>{{ CompatVersionUnknown() }}</td>
        <td>{{ CompatUnknown() }}</td>
        <td>11.50</td>
        <td>{{ CompatVersionUnknown() }}</td>
      </tr>
    </tbody>
  </table>
</div>
<h3 id="Polyfill">Polyfill</h3>
<pre class="brush: js">if (!Object.create) {
    Object.create = function (o) {
        if (arguments.length &gt; 1) {
            throw new Error('Object.create implementation only accepts the first parameter.');
        }
        function F() {}
        F.prototype = o;
        return new F();
    };
}
</pre>
<p>这个polyfill只实现了创建一个指定原型的对象的功能,而不能同时添加特定的属性,也就是没有实现原生的Object.create函数中的第二个参数.</p>
<h2 id="See_also" name="See_also">相关链接</h2>
<ul>
  <li><code><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/defineProperty" title="Core JavaScript 1.5 Reference/Global Objects/Object/defineProperty">Object.defineProperty</a></code></li>
  <li><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/defineProperties" title="Core JavaScript 1.5 Reference/Global Objects/Object/defineProperties">Object.defineProperties</a></li>
  <li><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/isPrototypeOf" title="Core JavaScript 1.5 Reference/Global Objects/Object/IsPrototypeOf">Object.prototype.isPrototypeOf</a></li>
  <li>John Resig's post on <a class="external" href="https://ejohn.org/blog/objectgetprototypeof/" title="https://ejohn.org/blog/objectgetprototypeof/">getPrototypeOf</a></li>
</ul>
恢复到这个版本