在Javascript对象上定义属性 - Object.definedProperties显示空对象

时间:2016-02-16 21:08:44

标签: javascript design-patterns

我一直在关注javascript设计模式,并使用在此位置找到的代码实现ES5属性。

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript

测试1

使用函数定义3个属性

  • 检查值是否正常:SUCCESS
  • 记录对象以查看数据是否正常:SUCCESS

测试2

使用Object.definedProperties定义3个属性

  • 检查值是否正常:SUCCESS
  • 记录对象以查看数据是否正常: FAIL

测试1代码

it('should construct object with some single properites added using helper function', function (done) {

  var person = Object.create(Object.prototype);

  // Populate the object with properties
  pattern.defineProp(person, "car", "Delorean");
  pattern.defineProp(person, "dateOfBirth", "1981");
  pattern.defineProp(person, "hasBeard", false);

  console.log(person.car);
  console.log(person);
  console.log(typeof person);
  console.log(JSON.stringify(person));

  person.car.should.equal('Delorean');
  person.dateOfBirth.should.equal('1981');
  person.hasBeard.should.equal(false);

  // Produces
  // Delorean
  // { car: 'Delorean', dateOfBirth: '1981', hasBeard: false }
  // object
  // {"car":"Delorean","dateOfBirth":"1981","hasBeard":false}

  done();
});

测试2代码

it('should construct object with multiple properties using standard ES5 syntax', function (done) {

  var person = Object.create(Object.prototype);

  // Populate the object with properties
  Object.defineProperties(person, {

    "car": {
      value: "Delorean",
      writable: true
    },
    "dateOfBirth": {
      value: "1981",
      writable: true
    },
    "hasBeard": {
      value: false,
      writable: true
    }

  });
  console.log(person.car);
  console.log(person);
  console.log(typeof person);
  console.log(JSON.stringify(person));

  person.car.should.equal('Delorean');
  person.dateOfBirth.should.equal('1981');
  person.hasBeard.should.equal(false);

  // Produces
  // Delorean
  // {}
  // object
  // {}

  done();
});

定义道具功能

exports.defineProp = function ( obj, key, value ){
  var config = {
    value: value,
    writable: true,
    enumerable: true,
    configurable: true
  };
  Object.defineProperty( obj, key, config );
};

Output

1 个答案:

答案 0 :(得分:3)

好吧,如果您使用标准Object.defineProperties,并省略enumerable属性,则默认为false。您的属性将不会显示,因为它们不可枚举。