文字表示法中的数据描述符(对象创建)

时间:2014-06-19 13:03:02

标签: javascript ecmascript-5

我知道ECMAScript5有两种创建对象的方法。

1 /文字表示法(默认情况下)将所有内部数据属性设置为true(可写,可配置和可枚举。

2 /使用Object.create方法(默认情况下)将所有数据描述符设置为false。

在文字表示法中将enumerable设置为false是否有效?在object2上执行此操作时,对象.key(obj2)是否应该返回一个空数组?

var obj1 = Object.create(null, {
  'name': {value: 'first object name'},
  'surename': {value: 'first object surname', enumerable: true, configurable: true}
});

var obj2 = {'x': {value: 10, enumerable: false}};

console.log(Object.keys(obj1)); // ["surename"] 
console.log(Object.keys(obj2)); // ["x"]

JsFiddle link

3 个答案:

答案 0 :(得分:3)

我也为此搜索过,而且找不到任何东西。你可以 来定义getter和setter函数,如果你需要的话,就像这样:

var x = {
  y: 6,
  get foo() {
    return this.y + 10;
  },
  set bar(value) {
    this.y = foo - 1;
  }
};

x.y; // 6
x.foo; // 16
x.bar = 8;
x.y; // 7
x.foo; // 17

我还定义了一个小实用程序,以便于用文字符号定义属性。这是:

/*
 * Facilitates defining properties with advanced attributes in literal notation.
 *
 * Example:
 *   var foo = {
 *     x: 6,
 *     bar: new Property({
 *       enumerable: false,
 *       get: function () {
 *         return this.x + 1
 *       }
 *     })
 *   }
 *   foo.bar // value is an object of type Property
 *   Properties.eval(foo)
 *   foo.bar // value is now 7
 */

'use strict'

/**
 * Constructor.
 *
 * @param {object} descriptor
 * the property descriptor, in the format used by <code>Object.defineProperty</code>
 *
 * @returns {Property}
 *
 * @see Object.defineProperty
 */
var Property = function (descriptor) {
  this.descriptor = descriptor
  Object.freeze(this)
}

Property.prototype.toString = function () {
  return 'Property'
}

var Properties = new Object(null)

/**
 * Replace all properties of type <code>Property</code> contained in the
 * specified object with the value associated with the <code>Property</code>.
 *
 * @param {object} object
 * the object
 */
Properties.eval = function (object) {
  // recursive
  for (var propertyName in object) {
    if (object.hasOwnProperty(propertyName)) {
      var property = object[propertyName]
      if (property instanceof Property) {
        Object.defineProperty(object, propertyName, property.descriptor)
        property = object[propertyName]
      }
      if (property instanceof Object) {
        Properties.eval(property)
      }
    }
  }
}

答案 1 :(得分:2)

Essentialy,这一行:

var obj2 = {'x': {value: 10, enumerable: false}};

您声明变量obj2,这是一个具有一个属性x的对象,该值是一个具有两个属性的对象:valueenumerableObject.create()是函数,它只使用文字符号来定义正在构造的对象的属性。

答案 2 :(得分:2)

  

在文字表示法中将enumerable设置为false是否有效?在object2上执行此操作时,不应该Object.keys(obj2)返回一个空数组吗?

取决于你的意思&#34;有效&#34;。正确的答案是不可能(至少在ES5中),所以你只需要定义一个具有两个属性的对象,每个属性都有一个对象作为值。

只需查看obj.x