propertyIsEnumerable

  • 版本网址缩略名: JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable
  • 版本标题: propertyIsEnumerable
  • 版本 id: 346593
  • 创建于:
  • 创建者: ziyunfei
  • 是否是当前版本?
  • 评论

修订内容

Summary

Returns a Boolean indicating whether the specified property is enumerable.

Method of Object
Implemented in JavaScript ?
ECMAScript Edition ECMAScript 3rd Edition

语法

obj.propertyIsEnumerable(prop)

参数

prop
需要测试的属性名.

描述

每个对象都有propertyIsEnumerable方法.该方法可以判断出指定的属性名是否是个可枚举的自身属性,也就是说该属性可以通过for...in循环等遍历到,不过有些属性虽然可以通过for...in循环遍历到,但因为它们不是自身属性,而是从原型链上继承的属性,所以该方法也会返回false.

注:从JavaScript 1.8.1(Firefox 3.6)开始, propertyIsEnumerable("prototype")返回false,而不是以前的true,这是为了符合ECMAScript 5规范.

例子

例子: propertyIsEnumerable方法的基本用法

下面的例子演示了propertyIsEnumerable方法在普通对象和数组上的基本用法:

var o = {};
var a = [];
o.prop = '我是个可枚举属性';
a[0] = '我是个可枚举属性';

o.propertyIsEnumerable('prop');   // 返回true
a.propertyIsEnumerable(0);        // 返回true

例子: 用户自定义对象和引擎内置对象

下面的例子演示了用户自定义对象和引擎内置对象上属性可枚举性的区别.

var a = ['我是个可枚举属性'];

a.propertyIsEnumerable(0);          // 返回true
a.propertyIsEnumerable('length');   // 返回false

Math.propertyIsEnumerable('random');   // 返回false
this.propertyIsEnumerable('Math');     // 返回false

例子: 自身属性和继承属性

var a = [];
a.propertyIsEnumerable('constructor');         // 返回false

function firstConstructor() {
  this.property = 'is not enumerable';
}

firstConstructor.prototype.firstMethod = function () {};

function secondConstructor() {
  this.method = function method() { return 'is enumerable'; };
}

secondConstructor.prototype = new firstConstructor;
secondConstructor.prototype.constructor = secondConstructor;

var o = new secondConstructor();
o.arbitraryProperty = 'is enumerable';

o.propertyIsEnumerable('arbitraryProperty');   // 返回true
o.propertyIsEnumerable('method');              // 返回true
o.propertyIsEnumerable('property');            // 返回false

o.property = 'is enumerable';

o.propertyIsEnumerable('property');            // 返回true

// 继承的属性相当于不存在这个属性,返回false
o.propertyIsEnumerable('prototype'); // 返回false 
o.propertyIsEnumerable('constructor'); // 返回false
o.propertyIsEnumerable('firstMethod'); // 返回false

相关链接

修订版来源

<h2 id="Summary" name="Summary">Summary</h2>
<p>Returns a Boolean indicating whether the specified property is enumerable.</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 ?</td>
    </tr>
    <tr>
      <td>ECMAScript Edition</td>
      <td>ECMAScript 3rd Edition</td>
    </tr>
  </tbody>
</table>
<h2 id="Syntax" name="Syntax">语法</h2>
<pre class="syntaxbox">
<code><em>obj</em>.propertyIsEnumerable(<em>prop</em>)</code></pre>
<h3 id="Parameters" name="Parameters">参数</h3>
<dl>
  <dt>
    <code>prop</code></dt>
  <dd>
    需要测试的属性名.</dd>
</dl>
<h2 id="Description" name="Description">描述</h2>
<p>每个对象都有<code>propertyIsEnumerable</code>方法.该方法可以判断出指定的属性名是否是个可枚举的自身属性,也就是说该属性可以通过<a href="/zh-CN/docs/JavaScript/Reference/Statements/for...in" title="JavaScript/Reference/Statements/for...in"><code>for...in</code></a>循环等遍历到,不过有些属性虽然可以通过for...in循环遍历到,但因为它们不是自身属性,而是从原型链上继承的属性,所以该方法也会返回<code>false</code>.</p>
<div class="note">
  <strong>注:</strong>从JavaScript 1.8.1(Firefox 3.6)开始, <code>propertyIsEnumerable("prototype")</code>返回false,而不是以前的true,这是为了符合ECMAScript 5规范.</div>
<h2 id="Examples" name="Examples">例子</h2>
<h3 id="Example:_A_basic_use_of_propertyIsEnumerable" name="Example:_A_basic_use_of_propertyIsEnumerable">例子: <code>propertyIsEnumerable</code>方法的基本用法</h3>
<p>下面的例子演示了<code>propertyIsEnumerable</code>方法在普通对象和数组上的基本用法:</p>
<pre class="brush: js">
var o = {};
var a = [];
o.prop = '我是个可枚举属性';
a[0] = '我是个可枚举属性';

o.propertyIsEnumerable('prop');   // 返回true
a.propertyIsEnumerable(0);        // 返回true
</pre>
<h3 id="Example:_User-defined_versus_built-in_objects" name="Example:_User-defined_versus_built-in_objects">例子: 用户自定义对象和引擎内置对象</h3>
<p>下面的例子演示了用户自定义对象和引擎内置对象上属性可枚举性的区别.</p>
<pre class="brush: js">
var a = ['我是个可枚举属性'];

a.propertyIsEnumerable(0);          // 返回true
a.propertyIsEnumerable('length');   // 返回false

Math.propertyIsEnumerable('random');   // 返回false
this.propertyIsEnumerable('Math');     // 返回false
</pre>
<h3 id="Example:_Direct_versus_inherited_properties" name="Example:_Direct_versus_inherited_properties">例子: 自身属性和继承属性</h3>
<pre class="brush: js">
var a = [];
a.propertyIsEnumerable('constructor');         // 返回false

function firstConstructor() {
  this.property = 'is not enumerable';
}

firstConstructor.prototype.firstMethod = function () {};

function secondConstructor() {
  this.method = function method() { return 'is enumerable'; };
}

secondConstructor.prototype = new firstConstructor;
secondConstructor.prototype.constructor = secondConstructor;

var o = new secondConstructor();
o.arbitraryProperty = 'is enumerable';

o.propertyIsEnumerable('arbitraryProperty');   // 返回true
o.propertyIsEnumerable('method');              // 返回true
o.propertyIsEnumerable('property');            // 返回false

o.property = 'is enumerable';

o.propertyIsEnumerable('property');            // 返回true

// 继承的属性相当于不存在这个属性,返回false
o.propertyIsEnumerable('prototype'); // 返回false 
o.propertyIsEnumerable('constructor'); // 返回false
o.propertyIsEnumerable('firstMethod'); // 返回false</pre>
<h2 id="See_also" name="See_also">相关链接</h2>
<ul>
  <li><a href="/zh-CN/docs/Enumerability_and_ownership_of_properties" title="/zh-CN/docs/Enumerability_and_ownership_of_properties">Enumerability and ownership of properties</a></li>
  <li><a href="/zh-CN/docs/JavaScript/Reference/Statements/for...in" title="JavaScript/Reference/Statements/for...in">for...in</a></li>
  <li><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/keys" title="JavaScript/Reference/Global Objects/Object/keys">Object.keys</a></li>
  <li><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/defineProperty" title="JavaScript/Reference/Global_Objects/Object/defineProperty">Object.defineProperty()</a></li>
</ul>
恢复到这个版本